Blame tests/check/libs/basesrc.c

Packit Service 963350
/* GStreamer
Packit Service 963350
 *
Packit Service 963350
 * some unit tests for GstBaseSrc
Packit Service 963350
 *
Packit Service 963350
 * Copyright (C) 2006-2017 Tim-Philipp Müller <tim centricular net>
Packit Service 963350
 *
Packit Service 963350
 * This library is free software; you can redistribute it and/or
Packit Service 963350
 * modify it under the terms of the GNU Library General Public
Packit Service 963350
 * License as published by the Free Software Foundation; either
Packit Service 963350
 * version 2 of the License, or (at your option) any later version.
Packit Service 963350
 *
Packit Service 963350
 * This library is distributed in the hope that it will be useful,
Packit Service 963350
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 963350
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 963350
 * Library General Public License for more details.
Packit Service 963350
 *
Packit Service 963350
 * You should have received a copy of the GNU Library General Public
Packit Service 963350
 * License along with this library; if not, write to the
Packit Service 963350
 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
Packit Service 963350
 * Boston, MA 02110-1301, USA.
Packit Service 963350
 */
Packit Service 963350
Packit Service 963350
#ifdef HAVE_CONFIG_H
Packit Service 963350
#include "config.h"
Packit Service 963350
#endif
Packit Service 963350
#include <gst/gst.h>
Packit Service 963350
#include <gst/check/gstcheck.h>
Packit Service 963350
#include <gst/check/gstconsistencychecker.h>
Packit Service 963350
#include <gst/base/gstbasesrc.h>
Packit Service 963350
Packit Service 963350
static GstPadProbeReturn
Packit Service 963350
eos_event_counter (GstObject * pad, GstPadProbeInfo * info, guint * p_num_eos)
Packit Service 963350
{
Packit Service 963350
  GstEvent *event = GST_PAD_PROBE_INFO_EVENT (info);
Packit Service 963350
Packit Service 963350
  fail_unless (event != NULL);
Packit Service 963350
  fail_unless (GST_IS_EVENT (event));
Packit Service 963350
Packit Service 963350
  if (GST_EVENT_TYPE (event) == GST_EVENT_EOS)
Packit Service 963350
    *p_num_eos += 1;
Packit Service 963350
Packit Service 963350
  return GST_PAD_PROBE_OK;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
/* basesrc_eos_events_push_live_op:
Packit Service 963350
 *  - make sure source does send an EOS event when operating in push
Packit Service 963350
 *    mode and being set to READY explicitly (like one might with
Packit Service 963350
 *    live sources)
Packit Service 963350
 */
Packit Service 963350
GST_START_TEST (basesrc_eos_events_push_live_op)
Packit Service 963350
{
Packit Service 963350
  GstStateChangeReturn state_ret;
Packit Service 963350
  GstElement *src, *sink, *pipe;
Packit Service 963350
  GstMessage *msg;
Packit Service 963350
  GstBus *bus;
Packit Service 963350
  GstPad *srcpad;
Packit Service 963350
  guint probe, num_eos = 0;
Packit Service 963350
  GstStreamConsistency *consistency;
Packit Service 963350
  GstEvent *eos_event;
Packit Service 963350
  guint32 eos_event_seqnum;
Packit Service 963350
Packit Service 963350
  pipe = gst_pipeline_new ("pipeline");
Packit Service 963350
  sink = gst_element_factory_make ("fakesink", "sink");
Packit Service 963350
  src = gst_element_factory_make ("fakesrc", "src");
Packit Service 963350
Packit Service 963350
  g_assert (pipe != NULL);
Packit Service 963350
  g_assert (sink != NULL);
Packit Service 963350
  g_assert (src != NULL);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_element_link (src, sink) == TRUE);
Packit Service 963350
Packit Service 963350
  g_object_set (sink, "can-activate-push", TRUE, NULL);
Packit Service 963350
  g_object_set (sink, "can-activate-pull", FALSE, NULL);
Packit Service 963350
Packit Service 963350
  g_object_set (src, "can-activate-push", TRUE, NULL);
Packit Service 963350
  g_object_set (src, "can-activate-pull", FALSE, NULL);
Packit Service 963350
Packit Service 963350
  /* set up event probe to count EOS events */
Packit Service 963350
  srcpad = gst_element_get_static_pad (src, "src");
Packit Service 963350
  fail_unless (srcpad != NULL);
Packit Service 963350
Packit Service 963350
  consistency = gst_consistency_checker_new (srcpad);
Packit Service 963350
Packit Service 963350
  probe = gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_EVENT_BOTH,
Packit Service 963350
      (GstPadProbeCallback) eos_event_counter, &num_eos, NULL);
Packit Service 963350
Packit Service 963350
  bus = gst_element_get_bus (pipe);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_PLAYING);
Packit Service 963350
  state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
  fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
Packit Service 963350
Packit Service 963350
  /* wait a second, then do controlled shutdown */
Packit Service 963350
  g_usleep (GST_USECOND * 1);
Packit Service 963350
Packit Service 963350
  /* shut down pipeline (should send EOS message) ... */
Packit Service 963350
  eos_event = gst_event_new_eos ();
Packit Service 963350
  eos_event_seqnum = gst_event_get_seqnum (eos_event);
Packit Service 963350
  gst_element_send_event (pipe, eos_event);
Packit Service 963350
Packit Service 963350
  /* ... and wait for the EOS message from the sink */
Packit Service 963350
  msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
Packit Service 963350
  fail_unless (msg != NULL);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
Packit Service 963350
Packit Service 963350
  /* should be exactly one EOS event */
Packit Service 963350
  fail_unless (num_eos == 1);
Packit Service 963350
  fail_unless (gst_message_get_seqnum (msg) == eos_event_seqnum);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_NULL);
Packit Service 963350
  gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
Packit Service 963350
  /* make sure source hasn't sent a second one when going PAUSED => READY */
Packit Service 963350
  fail_unless (num_eos == 1);
Packit Service 963350
Packit Service 963350
  gst_consistency_checker_free (consistency);
Packit Service 963350
Packit Service 963350
  gst_pad_remove_probe (srcpad, probe);
Packit Service 963350
  gst_object_unref (srcpad);
Packit Service 963350
  gst_message_unref (msg);
Packit Service 963350
  gst_object_unref (bus);
Packit Service 963350
  gst_object_unref (pipe);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
GST_END_TEST;
Packit Service 963350
Packit Service 963350
Packit Service 963350
Packit Service 963350
/* basesrc_eos_events_push:
Packit Service 963350
 *  - make sure source only sends one EOS when operating in push-mode,
Packit Service 963350
 *    reaching the max number of buffers, and is then shut down.
Packit Service 963350
 */
Packit Service 963350
GST_START_TEST (basesrc_eos_events_push)
Packit Service 963350
{
Packit Service 963350
  GstStateChangeReturn state_ret;
Packit Service 963350
  GstElement *src, *sink, *pipe;
Packit Service 963350
  GstMessage *msg;
Packit Service 963350
  GstBus *bus;
Packit Service 963350
  GstPad *srcpad;
Packit Service 963350
  guint probe, num_eos = 0;
Packit Service 963350
  GstStreamConsistency *consistency;
Packit Service 963350
Packit Service 963350
  pipe = gst_pipeline_new ("pipeline");
Packit Service 963350
  sink = gst_element_factory_make ("fakesink", "sink");
Packit Service 963350
  src = gst_element_factory_make ("fakesrc", "src");
Packit Service 963350
Packit Service 963350
  g_assert (pipe != NULL);
Packit Service 963350
  g_assert (sink != NULL);
Packit Service 963350
  g_assert (src != NULL);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_element_link (src, sink) == TRUE);
Packit Service 963350
Packit Service 963350
  g_object_set (sink, "can-activate-push", TRUE, NULL);
Packit Service 963350
  g_object_set (sink, "can-activate-pull", FALSE, NULL);
Packit Service 963350
Packit Service 963350
  g_object_set (src, "can-activate-push", TRUE, NULL);
Packit Service 963350
  g_object_set (src, "can-activate-pull", FALSE, NULL);
Packit Service 963350
  g_object_set (src, "num-buffers", 8, NULL);
Packit Service 963350
Packit Service 963350
  /* set up event probe to count EOS events */
Packit Service 963350
  srcpad = gst_element_get_static_pad (src, "src");
Packit Service 963350
  fail_unless (srcpad != NULL);
Packit Service 963350
Packit Service 963350
  consistency = gst_consistency_checker_new (srcpad);
Packit Service 963350
Packit Service 963350
  probe = gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_EVENT_BOTH,
Packit Service 963350
      (GstPadProbeCallback) eos_event_counter, &num_eos, NULL);
Packit Service 963350
Packit Service 963350
  bus = gst_element_get_bus (pipe);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_PLAYING);
Packit Service 963350
  state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
  fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
Packit Service 963350
Packit Service 963350
  msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
Packit Service 963350
  fail_unless (msg != NULL);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
Packit Service 963350
Packit Service 963350
  /* should be exactly one EOS event */
Packit Service 963350
  fail_unless (num_eos == 1);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_NULL);
Packit Service 963350
  gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
Packit Service 963350
  /* make sure source hasn't sent a second one when going PAUSED => READY */
Packit Service 963350
  fail_unless (num_eos == 1);
Packit Service 963350
Packit Service 963350
  gst_consistency_checker_free (consistency);
Packit Service 963350
Packit Service 963350
  gst_pad_remove_probe (srcpad, probe);
Packit Service 963350
  gst_object_unref (srcpad);
Packit Service 963350
  gst_message_unref (msg);
Packit Service 963350
  gst_object_unref (bus);
Packit Service 963350
  gst_object_unref (pipe);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
GST_END_TEST;
Packit Service 963350
Packit Service 963350
/* basesrc_eos_events_pull_live_op:
Packit Service 963350
 *  - make sure source doesn't send an EOS event when operating in
Packit Service 963350
 *    pull mode and being set to READY explicitly (like one might with
Packit Service 963350
 *    live sources)
Packit Service 963350
 */
Packit Service 963350
GST_START_TEST (basesrc_eos_events_pull_live_op)
Packit Service 963350
{
Packit Service 963350
  GstStateChangeReturn state_ret;
Packit Service 963350
  GstElement *src, *sink, *pipe;
Packit Service 963350
  GstPad *srcpad;
Packit Service 963350
  guint probe, num_eos = 0;
Packit Service 963350
Packit Service 963350
  pipe = gst_pipeline_new ("pipeline");
Packit Service 963350
  sink = gst_element_factory_make ("fakesink", "sink");
Packit Service 963350
  src = gst_element_factory_make ("fakesrc", "src");
Packit Service 963350
Packit Service 963350
  g_assert (pipe != NULL);
Packit Service 963350
  g_assert (sink != NULL);
Packit Service 963350
  g_assert (src != NULL);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_element_link (src, sink) == TRUE);
Packit Service 963350
Packit Service 963350
  g_object_set (sink, "can-activate-push", FALSE, NULL);
Packit Service 963350
  g_object_set (sink, "can-activate-pull", TRUE, NULL);
Packit Service 963350
Packit Service 963350
  g_object_set (src, "can-activate-push", FALSE, NULL);
Packit Service 963350
  g_object_set (src, "can-activate-pull", TRUE, NULL);
Packit Service 963350
Packit Service 963350
  /* set up event probe to count EOS events */
Packit Service 963350
  srcpad = gst_element_get_static_pad (src, "src");
Packit Service 963350
  fail_unless (srcpad != NULL);
Packit Service 963350
Packit Service 963350
  probe = gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_EVENT_BOTH,
Packit Service 963350
      (GstPadProbeCallback) eos_event_counter, &num_eos, NULL);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_PLAYING);
Packit Service 963350
  state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
  fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
Packit Service 963350
Packit Service 963350
  /* wait a second, then do controlled shutdown */
Packit Service 963350
  g_usleep (GST_USECOND * 1);
Packit Service 963350
Packit Service 963350
  /* shut down source only ... */
Packit Service 963350
  gst_element_set_state (src, GST_STATE_NULL);
Packit Service 963350
  state_ret = gst_element_get_state (src, NULL, NULL, -1);
Packit Service 963350
  fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_element_set_locked_state (src, TRUE) == TRUE);
Packit Service 963350
Packit Service 963350
  /* source shouldn't have sent any EOS event in pull mode */
Packit Service 963350
  fail_unless (num_eos == 0);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_NULL);
Packit Service 963350
  gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
Packit Service 963350
  /* make sure source hasn't sent an EOS when going PAUSED => READY either */
Packit Service 963350
  fail_unless (num_eos == 0);
Packit Service 963350
Packit Service 963350
  gst_pad_remove_probe (srcpad, probe);
Packit Service 963350
  gst_object_unref (srcpad);
Packit Service 963350
  gst_object_unref (pipe);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
GST_END_TEST;
Packit Service 963350
Packit Service 963350
/* basesrc_eos_events_pull:
Packit Service 963350
 *  - makes sure source doesn't send EOS event when reaching the max.
Packit Service 963350
 *    number of buffers configured in pull-mode
Packit Service 963350
 *  - make sure source doesn't send EOS event either when being shut down
Packit Service 963350
 *    (PAUSED => READY state change) after EOSing in pull mode 
Packit Service 963350
 */
Packit Service 963350
GST_START_TEST (basesrc_eos_events_pull)
Packit Service 963350
{
Packit Service 963350
  GstStateChangeReturn state_ret;
Packit Service 963350
  GstElement *src, *sink, *pipe;
Packit Service 963350
  GstMessage *msg;
Packit Service 963350
  GstBus *bus;
Packit Service 963350
  GstPad *srcpad;
Packit Service 963350
  guint probe, num_eos = 0;
Packit Service 963350
Packit Service 963350
  pipe = gst_pipeline_new ("pipeline");
Packit Service 963350
  sink = gst_element_factory_make ("fakesink", "sink");
Packit Service 963350
  src = gst_element_factory_make ("fakesrc", "src");
Packit Service 963350
Packit Service 963350
  g_assert (pipe != NULL);
Packit Service 963350
  g_assert (sink != NULL);
Packit Service 963350
  g_assert (src != NULL);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_element_link (src, sink) == TRUE);
Packit Service 963350
Packit Service 963350
  g_object_set (sink, "can-activate-push", FALSE, NULL);
Packit Service 963350
  g_object_set (sink, "can-activate-pull", TRUE, NULL);
Packit Service 963350
Packit Service 963350
  g_object_set (src, "can-activate-push", FALSE, NULL);
Packit Service 963350
  g_object_set (src, "can-activate-pull", TRUE, NULL);
Packit Service 963350
  g_object_set (src, "num-buffers", 8, NULL);
Packit Service 963350
Packit Service 963350
  /* set up event probe to count EOS events */
Packit Service 963350
  srcpad = gst_element_get_static_pad (src, "src");
Packit Service 963350
  fail_unless (srcpad != NULL);
Packit Service 963350
Packit Service 963350
  probe = gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_EVENT_BOTH,
Packit Service 963350
      (GstPadProbeCallback) eos_event_counter, &num_eos, NULL);
Packit Service 963350
Packit Service 963350
  bus = gst_element_get_bus (pipe);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_PLAYING);
Packit Service 963350
  state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
  fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
Packit Service 963350
Packit Service 963350
  msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
Packit Service 963350
  fail_unless (msg != NULL);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
Packit Service 963350
Packit Service 963350
  /* source shouldn't have sent any EOS event in pull mode */
Packit Service 963350
  fail_unless (num_eos == 0);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_NULL);
Packit Service 963350
  gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
Packit Service 963350
  /* make sure source hasn't sent an EOS when going PAUSED => READY either */
Packit Service 963350
  fail_unless (num_eos == 0);
Packit Service 963350
Packit Service 963350
  gst_pad_remove_probe (srcpad, probe);
Packit Service 963350
  gst_object_unref (srcpad);
Packit Service 963350
  gst_message_unref (msg);
Packit Service 963350
  gst_object_unref (bus);
Packit Service 963350
  gst_object_unref (pipe);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
GST_END_TEST;
Packit Service 963350
Packit Service 963350
Packit Service 963350
/* basesrc_eos_events_push_live_eos:
Packit Service 963350
 *  - make sure the source stops and emits EOS when we send an EOS event to the
Packit Service 963350
 *    pipeline.
Packit Service 963350
 */
Packit Service 963350
GST_START_TEST (basesrc_eos_events_push_live_eos)
Packit Service 963350
{
Packit Service 963350
  GstStateChangeReturn state_ret;
Packit Service 963350
  GstElement *src, *sink, *pipe;
Packit Service 963350
  GstMessage *msg;
Packit Service 963350
  GstBus *bus;
Packit Service 963350
  GstPad *srcpad;
Packit Service 963350
  guint probe, num_eos = 0;
Packit Service 963350
  gboolean res;
Packit Service 963350
Packit Service 963350
  pipe = gst_pipeline_new ("pipeline");
Packit Service 963350
  sink = gst_element_factory_make ("fakesink", "sink");
Packit Service 963350
  src = gst_element_factory_make ("fakesrc", "src");
Packit Service 963350
Packit Service 963350
  g_assert (pipe != NULL);
Packit Service 963350
  g_assert (sink != NULL);
Packit Service 963350
  g_assert (src != NULL);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_element_link (src, sink) == TRUE);
Packit Service 963350
Packit Service 963350
  g_object_set (sink, "can-activate-push", TRUE, NULL);
Packit Service 963350
  g_object_set (sink, "can-activate-pull", FALSE, NULL);
Packit Service 963350
Packit Service 963350
  g_object_set (src, "can-activate-push", TRUE, NULL);
Packit Service 963350
  g_object_set (src, "can-activate-pull", FALSE, NULL);
Packit Service 963350
Packit Service 963350
  /* set up event probe to count EOS events */
Packit Service 963350
  srcpad = gst_element_get_static_pad (src, "src");
Packit Service 963350
  fail_unless (srcpad != NULL);
Packit Service 963350
Packit Service 963350
  probe = gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_EVENT_BOTH,
Packit Service 963350
      (GstPadProbeCallback) eos_event_counter, &num_eos, NULL);
Packit Service 963350
Packit Service 963350
  bus = gst_element_get_bus (pipe);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_PLAYING);
Packit Service 963350
  state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
  fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
Packit Service 963350
Packit Service 963350
  /* wait a second, then emit the EOS */
Packit Service 963350
  g_usleep (GST_USECOND * 1);
Packit Service 963350
Packit Service 963350
  /* shut down source only (should send EOS event) ... */
Packit Service 963350
  res = gst_element_send_event (pipe, gst_event_new_eos ());
Packit Service 963350
  fail_unless (res == TRUE);
Packit Service 963350
Packit Service 963350
  /* ... and wait for the EOS message from the sink */
Packit Service 963350
  msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
Packit Service 963350
  fail_unless (msg != NULL);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
Packit Service 963350
Packit Service 963350
  /* should be exactly one EOS event */
Packit Service 963350
  fail_unless (num_eos == 1);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_NULL);
Packit Service 963350
  gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
Packit Service 963350
  /* make sure source hasn't sent a second one when going PAUSED => READY */
Packit Service 963350
  fail_unless (num_eos == 1);
Packit Service 963350
Packit Service 963350
  gst_pad_remove_probe (srcpad, probe);
Packit Service 963350
  gst_object_unref (srcpad);
Packit Service 963350
  gst_message_unref (msg);
Packit Service 963350
  gst_object_unref (bus);
Packit Service 963350
  gst_object_unref (pipe);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
GST_END_TEST;
Packit Service 963350
Packit Service 963350
/* basesrc_eos_events_pull_live_eos:
Packit Service 963350
 *  - make sure the source stops and emits EOS when we send an EOS event to the
Packit Service 963350
 *    pipeline.
Packit Service 963350
 */
Packit Service 963350
GST_START_TEST (basesrc_eos_events_pull_live_eos)
Packit Service 963350
{
Packit Service 963350
  GstStateChangeReturn state_ret;
Packit Service 963350
  GstElement *src, *sink, *pipe;
Packit Service 963350
  GstMessage *msg;
Packit Service 963350
  GstBus *bus;
Packit Service 963350
  GstPad *srcpad;
Packit Service 963350
  guint probe, num_eos = 0;
Packit Service 963350
  gboolean res;
Packit Service 963350
Packit Service 963350
  pipe = gst_pipeline_new ("pipeline");
Packit Service 963350
  sink = gst_element_factory_make ("fakesink", "sink");
Packit Service 963350
  src = gst_element_factory_make ("fakesrc", "src");
Packit Service 963350
Packit Service 963350
  g_assert (pipe != NULL);
Packit Service 963350
  g_assert (sink != NULL);
Packit Service 963350
  g_assert (src != NULL);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_element_link (src, sink) == TRUE);
Packit Service 963350
Packit Service 963350
  g_object_set (sink, "can-activate-push", FALSE, NULL);
Packit Service 963350
  g_object_set (sink, "can-activate-pull", TRUE, NULL);
Packit Service 963350
Packit Service 963350
  g_object_set (src, "can-activate-push", FALSE, NULL);
Packit Service 963350
  g_object_set (src, "can-activate-pull", TRUE, NULL);
Packit Service 963350
Packit Service 963350
  /* set up event probe to count EOS events */
Packit Service 963350
  srcpad = gst_element_get_static_pad (src, "src");
Packit Service 963350
  fail_unless (srcpad != NULL);
Packit Service 963350
Packit Service 963350
  probe = gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_EVENT_BOTH,
Packit Service 963350
      (GstPadProbeCallback) eos_event_counter, &num_eos, NULL);
Packit Service 963350
Packit Service 963350
  bus = gst_element_get_bus (pipe);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_PLAYING);
Packit Service 963350
  state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
  fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
Packit Service 963350
Packit Service 963350
  /* wait a second, then emit the EOS */
Packit Service 963350
  g_usleep (GST_USECOND * 1);
Packit Service 963350
Packit Service 963350
  /* shut down source only (should send EOS event) ... */
Packit Service 963350
  res = gst_element_send_event (pipe, gst_event_new_eos ());
Packit Service 963350
  fail_unless (res == TRUE);
Packit Service 963350
Packit Service 963350
  /* ... and wait for the EOS message from the sink */
Packit Service 963350
  msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
Packit Service 963350
  fail_unless (msg != NULL);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
Packit Service 963350
Packit Service 963350
  /* no EOS in pull mode */
Packit Service 963350
  fail_unless (num_eos == 0);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_NULL);
Packit Service 963350
  gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
Packit Service 963350
  /* make sure source hasn't sent a second one when going PAUSED => READY */
Packit Service 963350
  fail_unless (num_eos == 0);
Packit Service 963350
Packit Service 963350
  gst_pad_remove_probe (srcpad, probe);
Packit Service 963350
  gst_object_unref (srcpad);
Packit Service 963350
  gst_message_unref (msg);
Packit Service 963350
  gst_object_unref (bus);
Packit Service 963350
  gst_object_unref (pipe);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
GST_END_TEST;
Packit Service 963350
Packit Service 963350
Packit Service 963350
static GstPadProbeReturn
Packit Service 963350
segment_event_catcher (GstObject * pad, GstPadProbeInfo * info,
Packit Service 963350
    gpointer * user_data)
Packit Service 963350
{
Packit Service 963350
  GstEvent *event = GST_PAD_PROBE_INFO_EVENT (info);
Packit Service 963350
  GstEvent **last_event = (GstEvent **) user_data;
Packit Service 963350
  fail_unless (event != NULL);
Packit Service 963350
  fail_unless (GST_IS_EVENT (event));
Packit Service 963350
  fail_unless (user_data != NULL);
Packit Service 963350
Packit Service 963350
  if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
Packit Service 963350
    g_mutex_lock (&check_mutex);
Packit Service 963350
    fail_unless (*last_event == NULL);
Packit Service 963350
    *last_event = gst_event_copy (event);
Packit Service 963350
    g_cond_signal (&check_cond);
Packit Service 963350
    g_mutex_unlock (&check_mutex);
Packit Service 963350
  }
Packit Service 963350
Packit Service 963350
  return GST_PAD_PROBE_OK;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
/* basesrc_seek_events_rate_update:
Packit Service 963350
 *  - make sure we get expected segment after sending a seek event
Packit Service 963350
 */
Packit Service 963350
GST_START_TEST (basesrc_seek_events_rate_update)
Packit Service 963350
{
Packit Service 963350
  GstStateChangeReturn state_ret;
Packit Service 963350
  GstElement *src, *sink, *pipe;
Packit Service 963350
  GstMessage *msg;
Packit Service 963350
  GstBus *bus;
Packit Service 963350
  GstPad *probe_pad;
Packit Service 963350
  guint probe;
Packit Service 963350
  GstEvent *seg_event = NULL;
Packit Service 963350
  GstEvent *rate_seek;
Packit Service 963350
  gboolean event_ret;
Packit Service 963350
  const GstSegment *segment;
Packit Service 963350
Packit Service 963350
  pipe = gst_pipeline_new ("pipeline");
Packit Service 963350
  sink = gst_element_factory_make ("fakesink", "sink");
Packit Service 963350
  src = gst_element_factory_make ("fakesrc", "src");
Packit Service 963350
Packit Service 963350
  g_assert (pipe != NULL);
Packit Service 963350
  g_assert (sink != NULL);
Packit Service 963350
  g_assert (src != NULL);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_element_link (src, sink) == TRUE);
Packit Service 963350
Packit Service 963350
  bus = gst_element_get_bus (pipe);
Packit Service 963350
Packit Service 963350
  /* set up event probe to catch new segment event */
Packit Service 963350
  probe_pad = gst_element_get_static_pad (sink, "sink");
Packit Service 963350
  fail_unless (probe_pad != NULL);
Packit Service 963350
Packit Service 963350
  probe = gst_pad_add_probe (probe_pad, GST_PAD_PROBE_TYPE_EVENT_BOTH,
Packit Service 963350
      (GstPadProbeCallback) segment_event_catcher, &seg_event, NULL);
Packit Service 963350
Packit Service 963350
  /* prepare the seek */
Packit Service 963350
  rate_seek = gst_event_new_seek (0.5, GST_FORMAT_TIME, GST_SEEK_FLAG_NONE,
Packit Service 963350
      GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE,
Packit Service 963350
      GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
Packit Service 963350
Packit Service 963350
  GST_INFO ("going to playing");
Packit Service 963350
Packit Service 963350
  /* play */
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_PLAYING);
Packit Service 963350
  state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
  fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
Packit Service 963350
Packit Service 963350
  /* wait for the first segment to be posted, and flush it ... */
Packit Service 963350
  g_mutex_lock (&check_mutex);
Packit Service 963350
  while (seg_event == NULL)
Packit Service 963350
    g_cond_wait (&check_cond, &check_mutex);
Packit Service 963350
  gst_event_unref (seg_event);
Packit Service 963350
  seg_event = NULL;
Packit Service 963350
  g_mutex_unlock (&check_mutex);
Packit Service 963350
Packit Service 963350
  GST_INFO ("seeking");
Packit Service 963350
Packit Service 963350
  /* seek */
Packit Service 963350
  event_ret = gst_element_send_event (pipe, rate_seek);
Packit Service 963350
  fail_unless (event_ret == TRUE);
Packit Service 963350
Packit Service 963350
  /* wait for the updated segment to be posted, posting EOS make the loop
Packit Service 963350
   * thread exit before the updated segment is posted ... */
Packit Service 963350
  g_mutex_lock (&check_mutex);
Packit Service 963350
  while (seg_event == NULL)
Packit Service 963350
    g_cond_wait (&check_cond, &check_mutex);
Packit Service 963350
  g_mutex_unlock (&check_mutex);
Packit Service 963350
Packit Service 963350
  /* shut down pipeline only (should send EOS message) ... */
Packit Service 963350
  gst_element_send_event (pipe, gst_event_new_eos ());
Packit Service 963350
Packit Service 963350
  /* ... and wait for the EOS message from the sink */
Packit Service 963350
  msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
Packit Service 963350
  fail_unless (msg != NULL);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_NULL);
Packit Service 963350
  gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
Packit Service 963350
  GST_INFO ("stopped");
Packit Service 963350
Packit Service 963350
  /* check that we have go the event */
Packit Service 963350
  fail_unless (seg_event != NULL);
Packit Service 963350
Packit Service 963350
  gst_event_parse_segment (seg_event, &segment);
Packit Service 963350
  fail_unless (segment->rate == 0.5);
Packit Service 963350
Packit Service 963350
  gst_pad_remove_probe (probe_pad, probe);
Packit Service 963350
  gst_object_unref (probe_pad);
Packit Service 963350
  gst_message_unref (msg);
Packit Service 963350
  gst_event_unref (seg_event);
Packit Service 963350
  gst_object_unref (bus);
Packit Service 963350
  gst_object_unref (pipe);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
GST_END_TEST;
Packit Service 963350
Packit Service 963350
Packit Service 963350
typedef struct
Packit Service 963350
{
Packit Service 963350
  gboolean seeked;
Packit Service 963350
  gint buffer_count;
Packit Service 963350
  GList *events;
Packit Service 963350
} LastBufferSeekData;
Packit Service 963350
Packit Service 963350
static GstPadProbeReturn
Packit Service 963350
seek_on_buffer (GstObject * pad, GstPadProbeInfo * info, gpointer * user_data)
Packit Service 963350
{
Packit Service 963350
  LastBufferSeekData *data = (LastBufferSeekData *) user_data;
Packit Service 963350
Packit Service 963350
  fail_unless (user_data != NULL);
Packit Service 963350
Packit Service 963350
  if (info->type & GST_PAD_PROBE_TYPE_BUFFER) {
Packit Service 963350
    data->buffer_count++;
Packit Service 963350
Packit Service 963350
    if (!data->seeked) {
Packit Service 963350
      fail_unless (gst_pad_push_event (GST_PAD (pad),
Packit Service 963350
              gst_event_new_seek (1.0, GST_FORMAT_BYTES, GST_SEEK_FLAG_FLUSH,
Packit Service 963350
                  GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 1)));
Packit Service 963350
      data->seeked = TRUE;
Packit Service 963350
    }
Packit Service 963350
  } else if (info->type & GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM) {
Packit Service 963350
    data->events = g_list_append (data->events, gst_event_ref (info->data));
Packit Service 963350
  } else {
Packit Service 963350
    fail ("Should not be reached");
Packit Service 963350
  }
Packit Service 963350
  return GST_PAD_PROBE_OK;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
/* basesrc_seek_on_last_buffer:
Packit Service 963350
 *  - make sure basesrc doesn't go eos if a seek is sent
Packit Service 963350
 * after the last buffer push
Packit Service 963350
 *
Packit Service 963350
 * This is just a test and is a controlled environment.
Packit Service 963350
 * For testing purposes sending the seek from the streaming
Packit Service 963350
 * thread is ok but doing this in an application might not
Packit Service 963350
 * be a good idea.
Packit Service 963350
 */
Packit Service 963350
GST_START_TEST (basesrc_seek_on_last_buffer)
Packit Service 963350
{
Packit Service 963350
  GstStateChangeReturn state_ret;
Packit Service 963350
  GstElement *src, *sink, *pipe;
Packit Service 963350
  GstMessage *msg;
Packit Service 963350
  GstBus *bus;
Packit Service 963350
  GstPad *probe_pad;
Packit Service 963350
  guint probe;
Packit Service 963350
  GstEvent *seek;
Packit Service 963350
  LastBufferSeekData seek_data;
Packit Service 963350
Packit Service 963350
  pipe = gst_pipeline_new ("pipeline");
Packit Service 963350
  sink = gst_element_factory_make ("fakesink", "sink");
Packit Service 963350
  src = gst_element_factory_make ("fakesrc", "src");
Packit Service 963350
Packit Service 963350
  g_assert (pipe != NULL);
Packit Service 963350
  g_assert (sink != NULL);
Packit Service 963350
  g_assert (src != NULL);
Packit Service 963350
Packit Service 963350
  /* use 'sizemax' buffers to avoid receiving empty buffers */
Packit Service 963350
  g_object_set (src, "sizetype", 2, NULL);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), src) == TRUE);
Packit Service 963350
  fail_unless (gst_bin_add (GST_BIN (pipe), sink) == TRUE);
Packit Service 963350
Packit Service 963350
  fail_unless (gst_element_link (src, sink) == TRUE);
Packit Service 963350
Packit Service 963350
  bus = gst_element_get_bus (pipe);
Packit Service 963350
Packit Service 963350
  /* set up probe to catch the last buffer and send a seek event */
Packit Service 963350
  probe_pad = gst_element_get_static_pad (sink, "sink");
Packit Service 963350
  fail_unless (probe_pad != NULL);
Packit Service 963350
Packit Service 963350
  seek_data.buffer_count = 0;
Packit Service 963350
  seek_data.seeked = FALSE;
Packit Service 963350
  seek_data.events = NULL;
Packit Service 963350
Packit Service 963350
  probe =
Packit Service 963350
      gst_pad_add_probe (probe_pad,
Packit Service 963350
      GST_PAD_PROBE_TYPE_BUFFER | GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
Packit Service 963350
      (GstPadProbeCallback) seek_on_buffer, &seek_data, NULL);
Packit Service 963350
Packit Service 963350
  /* prepare the segment so that it has only one buffer */
Packit Service 963350
  seek = gst_event_new_seek (1, GST_FORMAT_BYTES, GST_SEEK_FLAG_NONE,
Packit Service 963350
      GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 1);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_READY);
Packit Service 963350
  fail_unless (gst_element_send_event (src, seek));
Packit Service 963350
Packit Service 963350
  GST_INFO ("going to playing");
Packit Service 963350
Packit Service 963350
  /* play */
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_PLAYING);
Packit Service 963350
  state_ret = gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
  fail_unless (state_ret == GST_STATE_CHANGE_SUCCESS);
Packit Service 963350
Packit Service 963350
  /* ... and wait for the EOS message from the sink */
Packit Service 963350
  msg = gst_bus_poll (bus, GST_MESSAGE_EOS | GST_MESSAGE_ERROR, -1);
Packit Service 963350
  fail_unless (msg != NULL);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) != GST_MESSAGE_ERROR);
Packit Service 963350
  fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_EOS);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (pipe, GST_STATE_NULL);
Packit Service 963350
  gst_element_get_state (pipe, NULL, NULL, -1);
Packit Service 963350
Packit Service 963350
  GST_INFO ("stopped");
Packit Service 963350
Packit Service 963350
  /* check that we have go the event */
Packit Service 963350
  fail_unless (seek_data.buffer_count == 2);
Packit Service 963350
  fail_unless (seek_data.seeked);
Packit Service 963350
Packit Service 963350
  /* events: stream-start -> segment -> segment -> eos */
Packit Service 963350
  fail_unless (g_list_length (seek_data.events) == 4);
Packit Service 963350
  {
Packit Service 963350
    GstEvent *event;
Packit Service 963350
Packit Service 963350
    event = seek_data.events->data;
Packit Service 963350
    fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_STREAM_START);
Packit Service 963350
    gst_event_unref (event);
Packit Service 963350
    seek_data.events = g_list_delete_link (seek_data.events, seek_data.events);
Packit Service 963350
Packit Service 963350
    event = seek_data.events->data;
Packit Service 963350
    fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT);
Packit Service 963350
    gst_event_unref (event);
Packit Service 963350
    seek_data.events = g_list_delete_link (seek_data.events, seek_data.events);
Packit Service 963350
Packit Service 963350
    event = seek_data.events->data;
Packit Service 963350
    fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT);
Packit Service 963350
    gst_event_unref (event);
Packit Service 963350
    seek_data.events = g_list_delete_link (seek_data.events, seek_data.events);
Packit Service 963350
Packit Service 963350
    event = seek_data.events->data;
Packit Service 963350
    fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_EOS);
Packit Service 963350
    gst_event_unref (event);
Packit Service 963350
    seek_data.events = g_list_delete_link (seek_data.events, seek_data.events);
Packit Service 963350
  }
Packit Service 963350
Packit Service 963350
  gst_pad_remove_probe (probe_pad, probe);
Packit Service 963350
  gst_object_unref (probe_pad);
Packit Service 963350
  gst_message_unref (msg);
Packit Service 963350
  gst_object_unref (bus);
Packit Service 963350
  gst_object_unref (pipe);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
GST_END_TEST;
Packit Service 963350
Packit Service 963350
typedef GstBaseSrc TestSrc;
Packit Service 963350
typedef GstBaseSrcClass TestSrcClass;
Packit Service 963350
Packit Service 963350
static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
Packit Service 963350
    GST_PAD_SRC,
Packit Service 963350
    GST_PAD_ALWAYS,
Packit Service 963350
    GST_STATIC_CAPS_ANY);
Packit Service 963350
Packit Service 963350
static GType test_src_get_type (void);
Packit Service 963350
Packit Service 963350
G_DEFINE_TYPE (TestSrc, test_src, GST_TYPE_BASE_SRC);
Packit Service 963350
Packit Service 963350
static void
Packit Service 963350
test_src_init (TestSrc * src)
Packit Service 963350
{
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
static GstFlowReturn
Packit Service 963350
test_src_create (GstBaseSrc * src, guint64 offset, guint size,
Packit Service 963350
    GstBuffer ** p_buf)
Packit Service 963350
{
Packit Service 963350
  GstBuffer *buf;
Packit Service 963350
  static int num = 0;
Packit Service 963350
Packit Service 963350
  fail_if (*p_buf != NULL);
Packit Service 963350
Packit Service 963350
  buf = gst_buffer_new ();
Packit Service 963350
  GST_BUFFER_OFFSET (buf) = num++;
Packit Service 963350
Packit Service 963350
  if (num == 1 || g_random_boolean ()) {
Packit Service 963350
    GstBufferList *buflist = gst_buffer_list_new ();
Packit Service 963350
Packit Service 963350
    gst_buffer_list_add (buflist, buf);
Packit Service 963350
Packit Service 963350
    buf = gst_buffer_new ();
Packit Service 963350
    GST_BUFFER_OFFSET (buf) = num++;
Packit Service 963350
    gst_buffer_list_add (buflist, buf);
Packit Service 963350
    gst_base_src_submit_buffer_list (src, buflist);
Packit Service 963350
  } else {
Packit Service 963350
    *p_buf = buf;
Packit Service 963350
  }
Packit Service 963350
Packit Service 963350
  return GST_FLOW_OK;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
static void
Packit Service 963350
test_src_class_init (TestSrcClass * klass)
Packit Service 963350
{
Packit Service 963350
  GstBaseSrcClass *gstbasesrc_class = GST_BASE_SRC_CLASS (klass);
Packit Service 963350
Packit Service 963350
  gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS (klass),
Packit Service 963350
      &src_template);
Packit Service 963350
Packit Service 963350
  gstbasesrc_class->create = test_src_create;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
static GstPad *mysinkpad;
Packit Service 963350
Packit Service 963350
static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
Packit Service 963350
    GST_PAD_SINK,
Packit Service 963350
    GST_PAD_ALWAYS,
Packit Service 963350
    GST_STATIC_CAPS_ANY);
Packit Service 963350
Packit Service 963350
#define NUM_BUFFERS 100
Packit Service 963350
static gboolean done;
Packit Service 963350
static guint expect_offset;
Packit Service 963350
Packit Service 963350
static GstFlowReturn
Packit Service 963350
chain_____func (GstPad * pad, GstObject * parent, GstBuffer * buf)
Packit Service 963350
{
Packit Service 963350
  GST_LOG ("  buffer # %3u", (guint) GST_BUFFER_OFFSET (buf));
Packit Service 963350
Packit Service 963350
  fail_unless_equals_int (GST_BUFFER_OFFSET (buf), expect_offset);
Packit Service 963350
  ++expect_offset;
Packit Service 963350
Packit Service 963350
  if (GST_BUFFER_OFFSET (buf) > NUM_BUFFERS) {
Packit Service 963350
    g_mutex_lock (&check_mutex);
Packit Service 963350
    done = TRUE;
Packit Service 963350
    g_cond_signal (&check_cond);
Packit Service 963350
    g_mutex_unlock (&check_mutex);
Packit Service 963350
  }
Packit Service 963350
  gst_buffer_unref (buf);
Packit Service 963350
Packit Service 963350
  return GST_FLOW_OK;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
static GstFlowReturn
Packit Service 963350
chainlist_func (GstPad * pad, GstObject * parent, GstBufferList * list)
Packit Service 963350
{
Packit Service 963350
  guint i, len;
Packit Service 963350
Packit Service 963350
  len = gst_buffer_list_length (list);
Packit Service 963350
Packit Service 963350
  GST_DEBUG ("buffer list with %u buffers", len);
Packit Service 963350
  for (i = 0; i < len; ++i) {
Packit Service 963350
    GstBuffer *buf = gst_buffer_list_get (list, i);
Packit Service 963350
    GST_LOG ("  buffer # %3u", (guint) GST_BUFFER_OFFSET (buf));
Packit Service 963350
Packit Service 963350
    fail_unless_equals_int (GST_BUFFER_OFFSET (buf), expect_offset);
Packit Service 963350
    ++expect_offset;
Packit Service 963350
  }
Packit Service 963350
Packit Service 963350
  gst_buffer_list_unref (list);
Packit Service 963350
  return GST_FLOW_OK;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
GST_START_TEST (basesrc_create_bufferlist)
Packit Service 963350
{
Packit Service 963350
  GstElement *src;
Packit Service 963350
Packit Service 963350
  src = g_object_new (test_src_get_type (), NULL);
Packit Service 963350
Packit Service 963350
  mysinkpad = gst_check_setup_sink_pad (src, &sinktemplate);
Packit Service 963350
  gst_pad_set_chain_function (mysinkpad, chain_____func);
Packit Service 963350
  gst_pad_set_chain_list_function (mysinkpad, chainlist_func);
Packit Service 963350
  gst_pad_set_active (mysinkpad, TRUE);
Packit Service 963350
Packit Service 963350
  done = FALSE;
Packit Service 963350
  expect_offset = 0;
Packit Service 963350
Packit Service 963350
  gst_element_set_state (src, GST_STATE_PLAYING);
Packit Service 963350
Packit Service 963350
  g_mutex_lock (&check_mutex);
Packit Service 963350
  while (!done)
Packit Service 963350
    g_cond_wait (&check_cond, &check_mutex);
Packit Service 963350
  g_mutex_unlock (&check_mutex);
Packit Service 963350
Packit Service 963350
  gst_element_set_state (src, GST_STATE_NULL);
Packit Service 963350
Packit Service 963350
  gst_check_teardown_sink_pad (src);
Packit Service 963350
Packit Service 963350
  gst_object_unref (src);
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
GST_END_TEST;
Packit Service 963350
Packit Service 963350
static Suite *
Packit Service 963350
gst_basesrc_suite (void)
Packit Service 963350
{
Packit Service 963350
  Suite *s = suite_create ("GstBaseSrc");
Packit Service 963350
  TCase *tc = tcase_create ("general");
Packit Service 963350
Packit Service 963350
  suite_add_tcase (s, tc);
Packit Service 963350
  tcase_add_test (tc, basesrc_eos_events_pull);
Packit Service 963350
  tcase_add_test (tc, basesrc_eos_events_push);
Packit Service 963350
  tcase_add_test (tc, basesrc_eos_events_push_live_op);
Packit Service 963350
  tcase_add_test (tc, basesrc_eos_events_pull_live_op);
Packit Service 963350
  tcase_add_test (tc, basesrc_eos_events_push_live_eos);
Packit Service 963350
  tcase_add_test (tc, basesrc_eos_events_pull_live_eos);
Packit Service 963350
  tcase_add_test (tc, basesrc_seek_events_rate_update);
Packit Service 963350
  tcase_add_test (tc, basesrc_seek_on_last_buffer);
Packit Service 963350
  tcase_add_test (tc, basesrc_create_bufferlist);
Packit Service 963350
Packit Service 963350
  return s;
Packit Service 963350
}
Packit Service 963350
Packit Service 963350
GST_CHECK_MAIN (gst_basesrc);