remove obsolete tests whitespace fixes

Original commit message from CVS:
remove obsolete tests
whitespace fixes
This commit is contained in:
Thomas Vander Stichele 2005-10-15 15:53:14 +00:00
parent 14bbecccf3
commit 2b33397ea9
92 changed files with 30 additions and 6618 deletions

View file

@ -14,20 +14,20 @@ GST_DEBUG_DIRS = debug
endif
SUBDIRS = \
bytestream caps cleanup controller \
caps \
$(GST_DEBUG_DIRS) \
dlopen \
elements indexers negotiation pad \
elements indexers \
$(GST_PARSE_DIRS) \
plugin refcounting schedulers states threads trigger
plugin refcounting states threads trigger
DIST_SUBDIRS = \
bytestream caps cleanup controller \
caps \
debug \
dlopen \
elements indexers negotiation pad \
elements indexers \
parse \
plugin refcounting schedulers states threads trigger
plugin refcounting states threads trigger
tests_pass =
tests_fail =

View file

@ -1,9 +0,0 @@
Makefile
Makefile.in
*.o
*.lo
*.la
.deps
.libs
test1
filepadsink

View file

@ -1,11 +0,0 @@
include ../Rules
tests_pass = filepadsink
tests_fail = test1
tests_ignore =
test1_SOURCES = test1.c gstbstest.c
test1_LDFLAGS = $(top_builddir)/libs/gst/bytestream/libgstbytestream.la
filepadsink_CFLAGS = $(AM_CFLAGS) -DTHE_FILE=\""$(top_srcdir)/configure.ac"\"
filepadsink_LDFLAGS = $(top_builddir)/libs/gst/bytestream/libgstbytestream.la

View file

@ -1,282 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Benjamin Otte <otte@gnome.org>
*
* 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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <gst/gst.h>
#include <gst/bytestream/filepad.h>
#include <stdio.h>
#include <string.h>
#define GST_TYPE_FP_SINK \
(gst_fp_sink_get_type())
#define GST_FP_SINK(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FP_SINK,GstFpSink))
#define GST_FP_SINK_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FP_SINK,GstFpSinkClass))
#define GST_IS_FP_SINK(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FP_SINK))
#define GST_IS_FP_SINK_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FP_SINK))
typedef struct _GstFpSink GstFpSink;
typedef struct _GstFpSinkClass GstFpSinkClass;
struct _GstFpSink
{
GstElement element;
/* pads */
GstFilePad *sinkpad;
/* fd */
FILE *stream;
guint state;
};
struct _GstFpSinkClass
{
GstElementClass parent_class;
};
GST_BOILERPLATE (GstFpSink, gst_fp_sink, GstElement, GST_TYPE_ELEMENT);
static void do_tests (GstFilePad * pad);
static void
gst_fp_sink_base_init (gpointer g_class)
{
}
static void
gst_fp_sink_class_init (GstFpSinkClass * klass)
{
}
static GstStaticPadTemplate template = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS ("ANY")
);
static void
gst_fp_sink_init (GstFpSink * fp)
{
GST_OBJECT_FLAG_SET (fp, GST_ELEMENT_EVENT_AWARE);
fp->sinkpad =
GST_FILE_PAD (gst_file_pad_new (gst_static_pad_template_get (&template),
"sink"));
gst_file_pad_set_iterate_function (fp->sinkpad, do_tests);
gst_element_add_pad (GST_ELEMENT (fp), GST_PAD (fp->sinkpad));
}
#define THE_CHECK(result) G_STMT_START{ \
gint64 pos = gst_file_pad_tell(fp->sinkpad); \
if (pos >= 0) \
g_assert (pos == ftell (fp->stream)); \
g_print ("%s (%"G_GINT64_FORMAT")\n", result ? "OK" : "no", pos); \
return result; \
}G_STMT_END
#define FAIL THE_CHECK(FALSE)
#define SUCCESS THE_CHECK(TRUE)
static gboolean
fp_read (GstFpSink * fp, guint size)
{
guint8 buf[size], buf2[size];
gint64 amount;
g_print ("reading %u bytes...", size);
amount = gst_file_pad_read (fp->sinkpad, buf, size);
if (amount == -EAGAIN)
FAIL;
g_assert (amount == size);
amount = fread (buf2, 1, amount, fp->stream);
g_assert (amount == size);
if (memcmp (buf, buf2, amount) != 0)
g_assert_not_reached ();
fp->state++;
SUCCESS;
}
static gboolean
fp_try_read (GstFpSink * fp, guint size)
{
guint8 buf[size], buf2[size];
gint64 amount;
size_t amount2;
g_print ("reading %u bytes...", size);
amount = gst_file_pad_try_read (fp->sinkpad, buf, size);
if (amount == -EAGAIN)
FAIL;
g_assert (amount > 0);
amount2 = fread (buf2, 1, amount, fp->stream);
g_assert (amount == amount2);
if (memcmp (buf, buf2, amount) != 0)
g_assert_not_reached ();
fp->state++;
SUCCESS;
}
static gboolean
fp_seek (GstFpSink * fp, gint64 pos, GstSeekType whence)
{
int seek_type = whence == GST_SEEK_METHOD_SET ? SEEK_SET :
whence == GST_SEEK_METHOD_CUR ? SEEK_CUR : SEEK_END;
g_print ("seeking to %s %" G_GINT64_FORMAT " bytes...",
whence == GST_SEEK_METHOD_SET ? "" : whence ==
GST_SEEK_METHOD_CUR ? "+-" : "-", pos);
if (gst_file_pad_seek (fp->sinkpad, pos, whence) != 0)
g_assert_not_reached ();
if (fseek (fp->stream, pos, seek_type) != 0)
g_assert_not_reached ();
fp->state++;
SUCCESS;
}
static gboolean
fp_eof (GstFpSink * fp)
{
guint8 buf;
g_print ("checking for EOF...");
if (!gst_file_pad_eof (fp->sinkpad))
FAIL;
if (fread (&buf, 1, 1, fp->stream) != 0)
g_assert_not_reached ();
fp->state++;
SUCCESS;
}
#define MIN_SIZE 10050
#define MAX_SIZE 1000000
static void
do_tests (GstFilePad * pad)
{
GstFpSink *fp = GST_FP_SINK (gst_pad_get_parent (GST_PAD (pad)));
while (TRUE) {
switch (fp->state) {
case 0:
if (!fp_try_read (fp, 50))
return;
break;
case 1:
if (!fp_try_read (fp, MAX_SIZE)) /* more than file size */
return;
break;
case 2:
if (!fp_seek (fp, 0, GST_SEEK_METHOD_SET))
return;
break;
case 3:
if (!fp_read (fp, 50))
return;
break;
case 4:
if (!fp_read (fp, MIN_SIZE - 50)) /* bigger than 1 buffer */
return;
break;
case 5:
if (!fp_seek (fp, -200, GST_SEEK_METHOD_CUR))
return;
break;
case 6:
if (!fp_read (fp, 50))
return;
break;
case 7:
if (!fp_seek (fp, 50, GST_SEEK_METHOD_CUR))
return;
break;
case 8:
if (!fp_read (fp, 50))
return;
break;
case 9:
if (!fp_seek (fp, MIN_SIZE - 50, GST_SEEK_METHOD_SET))
return;
break;
case 10:
if (!fp_read (fp, 50))
return;
break;
case 11:
if (!fp_seek (fp, 0, GST_SEEK_METHOD_END))
return;
break;
case 12:
if (!fp_eof (fp))
return;
gst_element_set_eos (GST_ELEMENT (fp));
return;
default:
g_assert_not_reached ();
}
}
}
#ifndef THE_FILE
# define THE_FILE "../../configure.ac"
#endif
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink;
long size;
gst_init (&argc, &argv);
gst_library_load ("gstbytestream");
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("filesrc", NULL);
g_assert (src);
sink = g_object_new (GST_TYPE_FP_SINK, NULL);
gst_object_set_name (GST_OBJECT (sink), "sink");
gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
if (!gst_element_link (src, sink))
g_assert_not_reached ();
g_object_set (src, "location", THE_FILE, NULL);
GST_FP_SINK (sink)->stream = fopen (THE_FILE, "rb");
g_assert (GST_FP_SINK (sink)->stream);
/* check correct file sizes */
if (fseek (GST_FP_SINK (sink)->stream, 0, SEEK_END) != 0)
g_assert_not_reached ();
size = ftell (GST_FP_SINK (sink)->stream);
if (fseek (GST_FP_SINK (sink)->stream, 0, SEEK_SET) != 0)
g_assert_not_reached ();
g_assert (size >= MIN_SIZE);
g_assert (size <= MAX_SIZE);
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
while (gst_bin_iterate (GST_BIN (pipeline)));
g_assert (GST_FP_SINK (sink)->state == 13);
g_object_unref (pipeline);
pipeline = NULL;
return 0;
}

View file

@ -1,418 +0,0 @@
/* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
*
* gstbstest.c:
*
* 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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <string.h>
#include <gst/gst.h>
#include <gst/bytestream/bytestream.h>
#define GST_TYPE_BSTEST (gst_bstest_get_type())
#define GST_BSTEST(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BSTEST,GstBsTest))
#define GST_BSTEST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BSTEST,GstBsTestClass))
#define GST_IS_BSTEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BSTEST))
#define GST_IS_BSTEST_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BSTEST))
typedef struct _GstBsTest GstBsTest;
typedef struct _GstBsTestClass GstBsTestClass;
struct _GstBsTest
{
GstElement element;
GstPad *sinkpad;
GstPad *srcpad;
GstByteStream *bs;
gchar *accesspattern;
guint num_patterns;
gchar **patterns;
guint sizemin;
guint sizemax;
gint count;
gboolean silent;
};
struct _GstBsTestClass
{
GstElementClass parent_class;
};
GType gst_bstest_get_type (void);
GstElementDetails gst_bstest_details = GST_ELEMENT_DETAILS ("ByteStreamTest",
"Filter",
"Test for the GstByteStream code",
"Erik Walthinsen <omega@temple-baptist.com>, "
"Wim Taymans <wim.taymans@chello.be>");
/* BsTest signals and args */
enum
{
/* FILL ME */
LAST_SIGNAL
};
enum
{
ARG_0,
ARG_SIZEMIN,
ARG_SIZEMAX,
ARG_COUNT,
ARG_SILENT,
ARG_ACCESSPATTERN,
};
static void gst_bstest_base_init (gpointer g_class);
static void gst_bstest_class_init (GstBsTestClass * klass);
static void gst_bstest_init (GstBsTest * bstest);
static void gst_bstest_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_bstest_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
static GstStateChangeReturn gst_bstest_change_state (GstElement * element,
GstStateChange transition);
static void gst_bstest_loop (GstElement * element);
static GstElementClass *parent_class = NULL;
/* static guint gst_bstest_signals[LAST_SIGNAL] = { 0 }; */
GType
gst_bstest_get_type (void)
{
static GType bstest_type = 0;
if (!bstest_type) {
static const GTypeInfo bstest_info = {
sizeof (GstBsTestClass),
gst_bstest_base_init,
NULL,
(GClassInitFunc) gst_bstest_class_init,
NULL,
NULL,
sizeof (GstBsTest),
0,
(GInstanceInitFunc) gst_bstest_init,
};
bstest_type =
g_type_register_static (GST_TYPE_ELEMENT, "BSTest", &bstest_info, 0);
}
return bstest_type;
}
static void
gst_bstest_base_init (gpointer g_class)
{
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
gst_element_class_set_details (gstelement_class, &gst_bstest_details);
}
static void
gst_bstest_class_init (GstBsTestClass * klass)
{
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
gobject_class = (GObjectClass *) klass;
gstelement_class = (GstElementClass *) klass;
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SIZEMIN,
g_param_spec_int ("sizemin", "sizemin", "sizemin", 0, G_MAXINT,
0, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SIZEMAX,
g_param_spec_int ("sizemax", "sizemax", "sizemax", 0, G_MAXINT,
384, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ACCESSPATTERN,
g_param_spec_string ("accesspattern", "accesspattern", "accesspattern",
"r", G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_COUNT,
g_param_spec_uint ("count", "count", "count",
0, G_MAXUINT, 0, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SILENT,
g_param_spec_boolean ("silent", "silent", "silent",
FALSE, G_PARAM_READWRITE));
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_bstest_set_property);
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_bstest_get_property);
gstelement_class->change_state = gst_bstest_change_state;
}
static GstCaps *
gst_bstest_getcaps (GstPad * pad)
{
GstBsTest *bstest = GST_BSTEST (gst_pad_get_parent (pad));
GstPad *otherpad;
otherpad = (pad == bstest->srcpad) ? bstest->sinkpad : bstest->srcpad;
return gst_pad_get_allowed_caps (otherpad);
}
GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS_ANY);
GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS_ANY);
static void
gst_bstest_init (GstBsTest * bstest)
{
bstest->sinkpad =
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
"sink");
gst_element_add_pad (GST_ELEMENT (bstest), bstest->sinkpad);
gst_pad_set_getcaps_function (bstest->sinkpad, gst_bstest_getcaps);
bstest->srcpad =
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
"src");
gst_element_add_pad (GST_ELEMENT (bstest), bstest->srcpad);
gst_pad_set_getcaps_function (bstest->srcpad, gst_bstest_getcaps);
gst_element_set_loop_function (GST_ELEMENT (bstest), gst_bstest_loop);
bstest->sizemin = 0;
bstest->sizemax = 384;
bstest->accesspattern = g_strdup ("r");
bstest->patterns = g_strsplit (bstest->accesspattern, ":", 0);
bstest->count = 5;
bstest->silent = FALSE;
bstest->bs = NULL;
}
static guint
gst_bstest_get_size (GstBsTest * bstest, gchar * sizestring, guint prevsize)
{
guint size;
if (sizestring[0] == 0) {
size = bstest->sizemax;
} else if (sizestring[0] == 'r') {
size =
bstest->sizemin +
(guint8) (((gfloat) bstest->sizemax) * rand () / (RAND_MAX +
(gfloat) bstest->sizemin));
} else if (sizestring[0] == '<') {
size = prevsize;
} else {
size = atoi (sizestring);
}
if (size == 0)
size++;
return size;
}
static void
gst_bstest_loop (GstElement * element)
{
GstBsTest *bstest;
GstBuffer *buf = NULL;
g_return_if_fail (element != NULL);
g_return_if_fail (GST_IS_BSTEST (element));
bstest = GST_BSTEST (element);
do {
guint size = 0;
guint i = 0;
guint8 *ptr;
while (i < bstest->num_patterns) {
buf = NULL;
if (bstest->patterns[i][0] == 'r') {
size = gst_bstest_get_size (bstest, &bstest->patterns[i][1], size);
if (!bstest->silent)
g_print ("bstest: ***** read %d bytes\n", size);
gst_bytestream_read (bstest->bs, &buf, size);
} else if (bstest->patterns[i][0] == 'f') {
size = gst_bstest_get_size (bstest, &bstest->patterns[i][1], size);
if (!bstest->silent)
g_print ("bstest: ***** flush %d bytes\n", size);
gst_bytestream_flush (bstest->bs, size);
} else if (!strncmp (bstest->patterns[i], "pb", 2)) {
size = gst_bstest_get_size (bstest, &bstest->patterns[i][2], size);
if (!bstest->silent)
g_print ("bstest: ***** peek bytes %d bytes\n", size);
gst_bytestream_peek_bytes (bstest->bs, &ptr, size);
} else if (bstest->patterns[i][0] == 'p') {
size = gst_bstest_get_size (bstest, &bstest->patterns[i][1], size);
if (!bstest->silent)
g_print ("bstest: ***** peek %d bytes\n", size);
gst_bytestream_peek (bstest->bs, &buf, size);
gst_buffer_unref (buf);
buf = NULL;
}
if (buf)
gst_pad_push (bstest->srcpad, GST_DATA (buf));
i++;
}
/* } while (!GST_ELEMENT_IS_COTHREAD_STOPPING (element)); */
} while (0);
}
static void
gst_bstest_set_property (GObject * object, guint prop_id, const GValue * value,
GParamSpec * pspec)
{
GstBsTest *bstest;
g_return_if_fail (GST_IS_BSTEST (object));
bstest = GST_BSTEST (object);
switch (prop_id) {
case ARG_SIZEMIN:
bstest->sizemin = g_value_get_int (value);
break;
case ARG_SIZEMAX:
bstest->sizemax = g_value_get_int (value);
break;
case ARG_ACCESSPATTERN:
if (bstest->accesspattern) {
g_free (bstest->accesspattern);
g_strfreev (bstest->patterns);
}
if (g_value_get_string (value) == NULL) {
gst_element_set_state (GST_ELEMENT (object), GST_STATE_NULL);
bstest->accesspattern = NULL;
bstest->num_patterns = 0;
} else {
guint i = 0;
bstest->accesspattern = g_strdup (g_value_get_string (value));
bstest->patterns = g_strsplit (bstest->accesspattern, ":", 0);
while (bstest->patterns[i++]);
bstest->num_patterns = i - 1;
}
break;
case ARG_COUNT:
bstest->count = g_value_get_uint (value);
break;
case ARG_SILENT:
bstest->silent = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gst_bstest_get_property (GObject * object, guint prop_id, GValue * value,
GParamSpec * pspec)
{
GstBsTest *bstest;
g_return_if_fail (GST_IS_BSTEST (object));
bstest = GST_BSTEST (object);
switch (prop_id) {
case ARG_SIZEMIN:
g_value_set_int (value, bstest->sizemin);
break;
case ARG_SIZEMAX:
g_value_set_int (value, bstest->sizemax);
break;
case ARG_ACCESSPATTERN:
g_value_set_string (value, bstest->accesspattern);
break;
case ARG_COUNT:
g_value_set_uint (value, bstest->count);
break;
case ARG_SILENT:
g_value_set_boolean (value, bstest->silent);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static GstStateChangeReturn
gst_bstest_change_state (GstElement * element, GstStateChange transition)
{
GstBsTest *bstest;
g_return_val_if_fail (GST_IS_BSTEST (element), GST_STATE_CHANGE_FAILURE);
bstest = GST_BSTEST (element);
if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
if (bstest->bs) {
gst_bytestream_destroy (bstest->bs);
bstest->bs = NULL;
}
} else {
if (!bstest->bs) {
bstest->bs = gst_bytestream_new (bstest->sinkpad);
}
}
if (GST_ELEMENT_CLASS (parent_class)->change_state)
return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
return GST_STATE_CHANGE_SUCCESS;
}
static gboolean
plugin_init (GstPlugin * plugin)
{
/* We need to create an ElementFactory for each element we provide.
* This consists of the name of the element, the GType identifier,
* and a pointer to the details structure at the top of the file.
*/
return gst_element_register (plugin, "bstest", GST_RANK_PRIMARY,
GST_TYPE_BSTEST);
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"bstest",
"test for the bytestream element",
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN)

View file

@ -1,230 +0,0 @@
#include <string.h>
#include <stdlib.h>
#include <gst/gst.h>
#define VM_THRES 1000
#define MAX_CONFIG_LINE 255
#define MAX_CONFIG_PATTERN 64
typedef struct
{
gint src_data;
gint src_sizetype;
gchar *bs_accesspattern;
gboolean integrity_check;
}
TestParam;
static GSList *params = NULL;
static guint8 count;
static guint iterations;
static gboolean integrity_check = TRUE;
static gboolean verbose = FALSE;
static gboolean dump = FALSE;
static void
handoff (GstElement * element, GstBuffer * buf, GstPad * pad, gpointer data)
{
if (GST_IS_BUFFER (buf)) {
if (integrity_check) {
gint i;
guint8 *ptr = GST_BUFFER_DATA (buf);
for (i = 0; i < GST_BUFFER_SIZE (buf); i++) {
if (*ptr++ != count++) {
g_print ("data error!\n");
return;
}
}
}
} else {
g_print ("not a buffer ! %p\n", buf);
}
}
static gchar *
create_desc (TestParam * param)
{
gchar *desc;
desc =
g_strdup_printf ("%s %s, pattern %s",
(param->src_sizetype == 2 ? "fixed" : "random"),
(param->src_data == 1 ? "src" : "subbuffer"), param->bs_accesspattern);
return desc;
}
static gboolean
read_param_file (gchar * filename)
{
FILE *fp;
gchar line[MAX_CONFIG_LINE + 1];
guint linenr = 0;
gchar pattern[MAX_CONFIG_PATTERN];
gint data, sizetype, integrity_check;
gchar *scan_str;
gboolean res = TRUE;
fp = fopen (filename, "rb");
if (fp == NULL)
return FALSE;
scan_str = g_strdup_printf ("%%d %%d %%%ds %%d", MAX_CONFIG_PATTERN - 1);
while (fgets (line, MAX_CONFIG_LINE, fp)) {
linenr++;
if (line[0] == '\n' || line[0] == '#')
continue;
if (sscanf (line, scan_str, &data, &sizetype, pattern,
&integrity_check) != 4) {
g_print ("error on line: %d\n", linenr);
res = FALSE;
break;
} else {
TestParam *param = g_malloc (sizeof (TestParam));
param->src_data = data;
param->src_sizetype = sizetype;
param->bs_accesspattern = g_strdup (pattern);
param->integrity_check = (integrity_check == 0 ? FALSE : TRUE);
params = g_slist_append (params, param);
}
}
g_free (scan_str);
return res;
}
static void
run_test (GstBin * pipeline, gint iters)
{
gint vm = 0;
gint maxiters = iters;
gint prev_percent = -1;
count = 0;
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
while (iters) {
gint newvm = gst_alloc_trace_live_all ();
gint percent;
percent = (gint) ((maxiters - iters + 1) * 100.0 / maxiters);
if (percent != prev_percent || newvm - vm > VM_THRES) {
g_print ("\r%d (delta %d) %.3d%% ", newvm, newvm - vm,
percent);
prev_percent = percent;
vm = newvm;
}
gst_bin_iterate (pipeline);
if (iters > 0)
iters--;
}
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
}
static void
usage (char *argv[])
{
g_print ("usage: %s [--verbose] [--dump] <paramfile> <iterations>\n",
argv[0]);
}
int
main (int argc, char *argv[])
{
GstElement *src;
GstElement *sink;
GstElement *bs;
GstElement *pipeline;
gint testnum = 0;
GSList *walk;
gint arg_walk;
gst_alloc_trace_set_flags_all (GST_ALLOC_TRACE_LIVE);
gst_init (&argc, &argv);
arg_walk = 1;
while ((arg_walk < argc) && (argv[arg_walk][0] == '-')) {
if (!strncmp (argv[arg_walk], "--verbose", 9))
verbose = TRUE;
else if (!strncmp (argv[arg_walk], "--dump", 6))
dump = TRUE;
else {
g_print ("unknown option %s (ignored)\n", argv[arg_walk]);
}
arg_walk++;
}
if (argc - arg_walk < 2) {
usage (argv);
return -1;
}
if (!read_param_file (argv[arg_walk])) {
g_print ("error reading file %s\n", argv[arg_walk]);
usage (argv);
return -1;
}
arg_walk++;
iterations = atoi (argv[arg_walk]);
pipeline = gst_element_factory_make ("pipeline", "pipeline");
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", "src");
g_assert (src);
sink = gst_element_factory_make ("fakesink", "sink");
g_assert (sink);
g_object_set (sink, "signal-handoff", TRUE, NULL);
g_signal_connect (G_OBJECT (sink), "handoff", G_CALLBACK (handoff), NULL);
bs = gst_element_factory_make ("bstest", "bs");
g_assert (bs);
gst_element_link_many (src, bs, sink, NULL);
gst_bin_add_many (GST_BIN (pipeline), src, bs, sink, NULL);
walk = params;
while (walk) {
gchar *desc;
TestParam *param = (TestParam *) (walk->data);
integrity_check = param->integrity_check;
g_print ("\n\nrunning test %d (%d iterations):\n", testnum + 1, iterations);
desc = create_desc (param);
g_print ("%s\n", desc);
g_free (desc);
g_object_set (G_OBJECT (src), "data", param->src_data,
"sizetype", param->src_sizetype,
"filltype", (integrity_check ? 5 : 0), "silent", !verbose, NULL);
g_object_set (G_OBJECT (bs), "accesspattern", param->bs_accesspattern,
"silent", !verbose, NULL);
g_object_set (G_OBJECT (sink), "dump", dump, "silent", !verbose, NULL);
run_test (GST_BIN (pipeline), iterations);
testnum++;
walk = g_slist_next (walk);
}
g_print ("\n\ndone\n");
return 0;
}

View file

@ -1,93 +0,0 @@
# lots of parameters here. values for the columns are like:
#
# - data property in fakesrc: 1 = allocate, 2 = subbuffer
# - sizetype property in fakesrc: 2 = fixed, 3 = random
#
# - accesspattern for bstest
# <action><size>[:<action><size>...]
#
# <action> can be:
# r = read
# p = peek
# pb = peek bytes
# f = flush
# <size> can be:
# <empty> = fixed size
# r = random size
# < = previous size
# <int> = this size
#
# - integrity check: 0 = no, 1 = yes
#
1 2 r 1
1 2 rr 1
1 3 r 1
1 3 rr 1
2 2 r 1
2 2 rr 1
2 3 r 1
2 3 rr 1
1 2 p:r< 1
1 2 pr:r< 1
1 3 p:r< 1
1 3 pr:r< 1
2 2 p:r< 1
2 2 pr:r< 1
2 3 p:r< 1
2 3 pr:r< 1
1 2 p:rr 1
1 2 pr:rr 1
1 3 p:rr 1
1 3 pr:rr 1
2 2 p:rr 1
2 2 pr:rr 1
2 3 p:rr 1
2 3 pr:rr 1
1 2 pb:r 1
1 2 pbr:r 1
1 3 pb:r 1
1 3 pbr:r 1
2 2 pb:r 1
2 2 pbr:r 1
2 3 pb:r 1
2 3 pbr:r 1
1 2 pb:rr 1
1 2 pbr:rr 1
1 3 pb:rr 1
1 3 pbr:rr 1
2 2 pb:rr 1
2 2 pbr:rr 1
2 3 pb:rr 1
2 3 pbr:rr 1
1 2 p:fr:rr 0
1 2 pr:fr:rr 0
1 3 p:fr:rr 0
1 3 pr:fr:rr 0
2 2 p:fr:rr 0
2 2 pr:fr:rr 0
2 3 p:fr:rr 0
2 3 pr:fr:rr 0
1 2 fr:rr 0
1 2 fr:rr 0
1 3 fr:rr 0
1 3 fr:rr 0
2 2 fr:rr 0
2 2 fr:rr 0
2 3 fr:rr 0
2 3 fr:rr 0
1 2 fr:fr:rr 0
1 2 fr:fr:rr 0
1 3 fr:fr:rr 0
1 3 fr:fr:rr 0
2 2 fr:fr:rr 0
2 2 fr:fr:rr 0
2 3 fr:fr:rr 0
2 3 fr:fr:rr 0
1 2 pbr:pbr:rr 1
1 2 pbr:pbr:rr 1
1 3 pbr:pbr:rr 1
1 3 pbr:pbr:rr 1
2 2 pbr:pbr:rr 1
2 2 pbr:pbr:rr 1
2 3 pbr:pbr:rr 1
2 3 pbr:pbr:rr 1

View file

@ -36,7 +36,7 @@ GST_CAPS_FACTORY (rawcaps4,
"fourcc", GST_PROPS_LIST (
GST_PROPS_FOURCC (GST_STR_FOURCC ("YUY2")),
GST_PROPS_FOURCC (GST_STR_FOURCC ("YV12")),
GST_PROPS_FOURCC (GST_STR_FOURCC ("YUYV"))
GST_PROPS_FOURCC (GST_STR_FOURCC ("YUYV"))
),
"height", GST_PROPS_INT_RANGE (16, 4096)
)

View file

@ -31,13 +31,13 @@ gint
main (gint argc, gchar * argv[])
{
/* this file contains random tests for stuff that went wrong in some version
* and should be tested so we're sure it works right now
* and should be tested so we're sure it works right now
* Please add what exactly the code tests for in your test */
gst_init (&argc, &argv);
/* TEST 1:
* gstcaps.c 1.120 used a code path that caused a GST_ERROR for the tested
* gstcaps.c 1.120 used a code path that caused a GST_ERROR for the tested
* caps when simplifying even though that is absolutely valid */
{
GstCaps *caps =
@ -50,7 +50,7 @@ main (gint argc, gchar * argv[])
}
/* TEST 2:
* gstvalue.c 1.34 had a broken comparison function for int ranges that
* gstvalue.c 1.34 had a broken comparison function for int ranges that
* returned GST_VALUE_EQUAL even though the range end was different */
{
GValue v1 = { 0, };

View file

@ -1,10 +0,0 @@
test-registry.xml
*.bb
*.bbg
*.da
cleanup1
cleanup2
cleanup3
cleanup4
cleanup5

View file

@ -1,7 +0,0 @@
include ../Rules
tests_pass = cleanup1 cleanup2 cleanup4 cleanup5
tests_fail =
# cleanup3 fails depending on the machine
tests_ignore = cleanup3

View file

@ -1,60 +0,0 @@
#include <gst/gst.h>
static GstElement *
create_pipeline (void)
{
GstElement *fakesrc, *fakesink;
GstElement *pipeline;
pipeline = gst_pipeline_new ("main_pipeline");
fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
fakesink = gst_element_factory_make ("fakesink", "fakesink");
gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL);
gst_element_link (fakesrc, fakesink);
g_object_set (G_OBJECT (fakesrc), "num_buffers", 5, NULL);
return pipeline;
}
gint
main (gint argc, gchar * argv[])
{
GstElement *pipeline;
gint i = 1000;
gint step = 100;
free (malloc (8)); /* -lefence */
gst_init (&argc, &argv);
g_mem_chunk_info ();
while (i--) {
if (i % step == 0)
fprintf (stderr, "%10d\r", i);
pipeline = create_pipeline ();
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
}
fprintf (stderr, "\n");
g_mem_chunk_info ();
return 0;
}

View file

@ -1,64 +0,0 @@
#include <gst/gst.h>
static GstElement *
create_pipeline (void)
{
GstElement *fakesrc, *fakesink;
GstElement *pipeline;
GstElement *bin;
pipeline = gst_pipeline_new ("main_pipeline");
fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
bin = gst_bin_new ("bin");
fakesink = gst_element_factory_make ("fakesink", "fakesink");
gst_bin_add (GST_BIN (bin), fakesink);
gst_element_add_ghost_pad (bin, gst_element_get_pad (fakesink, "sink"),
"sink");
gst_bin_add_many (GST_BIN (pipeline), fakesrc, bin, NULL);
gst_element_link (fakesrc, bin);
g_object_set (G_OBJECT (fakesrc), "num_buffers", 5, NULL);
return pipeline;
}
gint
main (gint argc, gchar * argv[])
{
GstElement *pipeline;
gint i = 1000;
gint step = 100;
free (malloc (8)); /* -lefence */
gst_init (&argc, &argv);
g_mem_chunk_info ();
while (i--) {
if (i % step == 0)
fprintf (stderr, "%10d\r", i);
pipeline = create_pipeline ();
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
}
fprintf (stderr, "\n");
g_mem_chunk_info ();
return 0;
}

View file

@ -1,68 +0,0 @@
#include <gst/gst.h>
static GstElement *
create_pipeline (void)
{
GstElement *fakesrc, *fakesink;
GstElement *pipeline;
GstElement *thread, *queue;
pipeline = gst_pipeline_new ("main_pipeline");
fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
thread = gst_thread_new ("thread");
fakesink = gst_element_factory_make ("fakesink", "fakesink");
queue = gst_element_factory_make ("queue", "queue");
gst_bin_add (GST_BIN (thread), fakesink);
gst_bin_add (GST_BIN (thread), queue);
gst_element_link (queue, fakesink);
gst_element_add_ghost_pad (thread, gst_element_get_pad (queue, "sink"),
"sink");
gst_element_link (fakesrc, thread);
gst_bin_add (GST_BIN (pipeline), fakesrc);
gst_bin_add (GST_BIN (pipeline), thread);
g_object_set (G_OBJECT (fakesrc), "num_buffers", 5, NULL);
return pipeline;
}
gint
main (gint argc, gchar * argv[])
{
GstElement *pipeline;
gint i = 10000;
gint step = 100;
free (malloc (8)); /* -lefence */
gst_init (&argc, &argv);
g_mem_chunk_info ();
while (i--) {
if (i % step == 0)
fprintf (stderr, "%10d\r", i);
pipeline = create_pipeline ();
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
}
fprintf (stderr, "\n");
g_mem_chunk_info ();
return 0;
}

View file

@ -1,52 +0,0 @@
#include <gst/gst.h>
gint
main (gint argc, gchar * argv[])
{
GstElement *pipeline;
GstElement *fakesrc;
gint i;
free (malloc (8)); /* -lefence */
gst_init (&argc, &argv);
i = 1000;
pipeline = gst_pipeline_new ("main_pipeline");
fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
g_object_set (G_OBJECT (fakesrc), "num_buffers", 5, NULL);
gst_bin_add (GST_BIN (pipeline), fakesrc);
g_mem_chunk_info ();
while (i--) {
GstElement *bin;
GstElement *fakesink;
g_print ("+");
bin = gst_bin_new ("bin");
fakesink = gst_element_factory_make ("fakesink", "fakesink");
gst_bin_add (GST_BIN (bin), fakesink);
gst_bin_add (GST_BIN (pipeline), bin);
gst_element_link (fakesrc, fakesink);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
g_print ("-");
gst_bin_remove (GST_BIN (pipeline), GST_ELEMENT (bin));
}
g_print ("\n");
g_mem_chunk_info ();
return 0;
}

View file

@ -1,41 +0,0 @@
#include <gst/gst.h>
int
main (int argc, char *argv[])
{
GstElement *bin, *element;
gint i = 1000;
gint step = 100;
free (malloc (8)); /* -lefence */
gst_init (&argc, &argv);
g_mem_chunk_info ();
bin = gst_pipeline_new ("pipeline");
while (i--) {
GstPad *pad;
if (i % step == 0)
fprintf (stderr, "\r%10d", i);
element = gst_element_factory_make ("tee", "tee");
if (!element)
break;
pad = gst_element_get_request_pad (element, "src%d");
gst_bin_add (GST_BIN (bin), element);
gst_bin_remove (GST_BIN (bin), element);
}
fprintf (stderr, "+\n");
gst_object_unref (bin);
g_mem_chunk_info ();
return 0;
}

View file

@ -1,6 +1,6 @@
/*
* interpolator.c
*
*
* test interpolator methods
*
*/

View file

@ -38,7 +38,7 @@ main (gint argc, gchar * argv[])
GST_ERROR ("This should print null: %" GST_PTR_FORMAT, NULL);
GST_ERROR ("This should print a pointer: %" GST_PTR_FORMAT, &null);
/* 64 bit address to a 32 bit int will cause the GObject interpretation
* to segfault; since GST_PTR_FORMAT only works on stuff with
* to segfault; since GST_PTR_FORMAT only works on stuff with
* sizeof(gpointer) */
/* GST_ERROR ("This should print a pointer: %" GST_PTR_FORMAT, &zero); */

View file

@ -5,7 +5,7 @@
* which shows a bug in 0.3.2 :
* request pad, get 0
* request pad, get 1
* remove pad 0,
* remove pad 0,
* request pad, get 1 (number of pads), already exists, assert fail
*
* thomas@apestaart.org

View file

@ -1,2 +0,0 @@
pad_link

View file

@ -1,5 +0,0 @@
include ../Rules
tests_pass = pad_link
tests_fail =
tests_ignore =

View file

@ -1,35 +0,0 @@
#include <gst/gst.h>
/* this test checks that gst_pad_link takes into account all available
* information when trying to link two pads.
* Because identity proxies caps, the caps in the first and second link
* must be compatible for this pipeline to work.
* Since they are not, the second linkig attempt should fail.
*/
gint
main (int argc, gchar ** argv)
{
GstElement *src, *identity, *sink;
GstCaps *one, *two;
gst_init (&argc, &argv);
/* create incompatible caps */
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
identity = gst_element_factory_make ("identity", NULL);
g_assert (identity);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
one = gst_caps_from_string ("some/mime");
two = gst_caps_from_string ("other/mime");
g_assert (GST_PAD_LINK_SUCCESSFUL (gst_pad_link_filtered (gst_element_get_pad
(src, "src"), gst_element_get_pad (identity, "sink"), one)));
g_assert (!GST_PAD_LINK_SUCCESSFUL (gst_pad_link_filtered (gst_element_get_pad
(identity, "src"), gst_element_get_pad (sink, "sink"), two)));
return 0;
}

View file

@ -1,5 +0,0 @@
include ../Rules
tests_pass = link
tests_fail = chainnopull getnopush
tests_ignore =

View file

@ -1,66 +0,0 @@
/*
* this tests that chain-based pads don't pull.
*/
#include <gst/gst.h>
typedef struct _GstTestSink
{
GstElement parent;
GstPad *sinkpad;
} GstTestSink;
typedef GstElementClass GstTestSinkClass;
static void
gst_test_sink_class_init (GstTestSinkClass * klass)
{
}
static void
gst_test_sink_base_init (gpointer klass)
{
}
static void
gst_test_sink_chain (GstPad * pad, GstData * data)
{
data = gst_pad_pull (pad);
}
static void
gst_test_sink_init (GstTestSink * sink)
{
sink->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
gst_pad_set_chain_function (sink->sinkpad, gst_test_sink_chain);
gst_element_add_pad (GST_ELEMENT (sink), sink->sinkpad);
}
GST_BOILERPLATE (GstTestSink, gst_test_sink, GstElement, GST_TYPE_ELEMENT);
int
main (int argc, char *argv[])
{
GstElement *pipeline, *fakesrc, *testsink;
gint n;
gst_init (&argc, &argv);
pipeline = gst_pipeline_new ("p");
fakesrc = gst_element_factory_make ("fakesrc", "src");
testsink = g_object_new (gst_test_sink_get_type (), NULL);
gst_object_set_name (GST_OBJECT (testsink), "sink");
gst_bin_add_many (GST_BIN (pipeline), fakesrc, testsink, NULL);
gst_element_link (fakesrc, testsink);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
for (n = 0; n < 100; n++) {
if (!gst_bin_iterate (GST_BIN (pipeline)))
break;
}
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
return 0;
}

View file

@ -1,71 +0,0 @@
/*
* this tests that get-based pads don't push.
*/
#include <gst/gst.h>
typedef struct _GstTestSrc
{
GstElement parent;
GstPad *srcpad;
} GstTestSrc;
typedef GstElementClass GstTestSrcClass;
static void
gst_test_src_class_init (GstTestSrcClass * klass)
{
}
static void
gst_test_src_base_init (gpointer klass)
{
}
static GstData *
gst_test_src_get (GstPad * pad)
{
GstEvent *event;
event = gst_event_new (GST_EVENT_INTERRUPT);
gst_event_ref (event);
gst_pad_push (pad, GST_DATA (event));
return GST_DATA (event);
}
static void
gst_test_src_init (GstTestSrc * src)
{
src->srcpad = gst_pad_new ("src", GST_PAD_SRC);
gst_pad_set_get_function (src->srcpad, gst_test_src_get);
gst_element_add_pad (GST_ELEMENT (src), src->srcpad);
}
GST_BOILERPLATE (GstTestSrc, gst_test_src, GstElement, GST_TYPE_ELEMENT);
int
main (int argc, char *argv[])
{
GstElement *pipeline, *testsrc, *fakesink;
gint n;
gst_init (&argc, &argv);
pipeline = gst_pipeline_new ("p");
testsrc = g_object_new (gst_test_src_get_type (), NULL);
gst_object_set_name (GST_OBJECT (testsrc), "src");
fakesink = gst_element_factory_make ("fakesink", "sink");
gst_bin_add_many (GST_BIN (pipeline), testsrc, fakesink, NULL);
gst_element_link (testsrc, fakesink);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
for (n = 0; n < 100; n++) {
if (!gst_bin_iterate (GST_BIN (pipeline)))
break;
}
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
return 0;
}

View file

@ -1,194 +0,0 @@
/*
* Test that:
* - get-based sources can return data, loop-based sources can push.
* - chain-based filters receive/push, loop-based filters can pull/push.
* - chain-based sinks receive, loop-based sinks pull.
*/
#include <gst/gst.h>
/*
* Scary type code.
*/
typedef struct _GstTestElement
{
GstElement parent;
GstPad *srcpad, *sinkpad;
} GstTestSrc, GstTestFilter, GstTestSink, GstTestElement;
typedef GstElementClass GstTestSrcClass, GstTestFilterClass, GstTestSinkClass,
GstTestElementClass;
#define gst_test_src_class_init gst_test_element_class_init
#define gst_test_filter_class_init gst_test_element_class_init
#define gst_test_sink_class_init gst_test_element_class_init
#define gst_test_src_base_init gst_test_element_base_init
#define gst_test_filter_base_init gst_test_element_base_init
#define gst_test_sink_base_init gst_test_element_base_init
static void
gst_test_element_class_init (GstTestElementClass * klass)
{
}
static void
gst_test_element_base_init (gpointer klass)
{
}
/*
* Actual element code.
*/
gboolean loop = FALSE;
static GstData *
gst_test_src_get (GstPad * pad)
{
return GST_DATA (gst_event_new (GST_EVENT_INTERRUPT));
}
static void
gst_test_src_loop (GstElement * element)
{
GstTestSrc *src = (GstTestElement *) element;
gst_pad_push (src->srcpad, gst_test_src_get (src->srcpad));
}
static void
gst_test_src_init (GstTestElement * src)
{
src->srcpad = gst_pad_new ("src", GST_PAD_SRC);
if (loop) {
gst_element_set_loop_function (GST_ELEMENT (src), gst_test_src_loop);
} else {
gst_pad_set_get_function (src->srcpad, gst_test_src_get);
}
gst_element_add_pad (GST_ELEMENT (src), src->srcpad);
GST_OBJECT_FLAG_SET (src, GST_ELEMENT_EVENT_AWARE);
}
static void
gst_test_filter_chain (GstPad * pad, GstData * data)
{
GstTestFilter *filter = (GstTestElement *) gst_pad_get_parent (pad);
gst_pad_push (filter->srcpad, data);
}
static void
gst_test_filter_loop (GstElement * element)
{
GstTestFilter *filter = (GstTestElement *) element;
gst_test_filter_chain (filter->sinkpad, gst_pad_pull (filter->sinkpad));
}
static void
gst_test_filter_init (GstTestElement * filter)
{
filter->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
if (loop) {
gst_element_set_loop_function (GST_ELEMENT (filter), gst_test_filter_loop);
} else {
gst_pad_set_chain_function (filter->sinkpad, gst_test_filter_chain);
}
gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
filter->srcpad = gst_pad_new ("src", GST_PAD_SRC);
gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
GST_OBJECT_FLAG_SET (filter, GST_ELEMENT_EVENT_AWARE);
}
static void
gst_test_sink_chain (GstPad * pad, GstData * data)
{
gst_data_unref (data);
}
static void
gst_test_sink_loop (GstElement * element)
{
GstTestSink *sink = (GstTestElement *) element;
gst_test_sink_chain (sink->sinkpad, gst_pad_pull (sink->sinkpad));
}
static void
gst_test_sink_init (GstTestElement * sink)
{
sink->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
if (loop) {
gst_element_set_loop_function (GST_ELEMENT (sink), gst_test_sink_loop);
} else {
gst_pad_set_chain_function (sink->sinkpad, gst_test_sink_chain);
}
gst_element_add_pad (GST_ELEMENT (sink), sink->sinkpad);
GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_EVENT_AWARE);
}
#define parent_class src_parent_class
GST_BOILERPLATE (GstTestSrc, gst_test_src, GstElement, GST_TYPE_ELEMENT);
#undef parent_class
#define parent_class filter_parent_class
GST_BOILERPLATE (GstTestFilter, gst_test_filter, GstElement, GST_TYPE_ELEMENT);
#undef parent_class
#define parent_class sink_parent_class
GST_BOILERPLATE (GstTestSink, gst_test_sink, GstElement, GST_TYPE_ELEMENT);
#undef parent_class
/*
* Actual test.
*/
static void
cb_error (GstElement * element)
{
g_assert_not_reached ();
}
int
main (int argc, char *argv[])
{
GstElement *pipeline, *src, *filter, *sink;
gint n, r;
gboolean res;
gst_init (&argc, &argv);
for (r = 0; r < 2; r++) {
pipeline = gst_pipeline_new ("p");
g_signal_connect (pipeline, "error", G_CALLBACK (cb_error), NULL);
src = g_object_new (gst_test_src_get_type (), NULL);
gst_object_set_name (GST_OBJECT (src), "src");
filter = g_object_new (gst_test_filter_get_type (), NULL);
gst_object_set_name (GST_OBJECT (filter), "filter");
sink = g_object_new (gst_test_sink_get_type (), NULL);
gst_object_set_name (GST_OBJECT (sink), "sink");
gst_bin_add_many (GST_BIN (pipeline), src, filter, sink, NULL);
res = gst_element_link (src, filter);
g_assert (res);
res = gst_element_link (filter, sink);
g_assert (res);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
for (n = 0; n < 100; n++) {
if (!gst_bin_iterate (GST_BIN (pipeline)))
g_assert_not_reached ();
}
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
/* switch element types */
g_print ("Loop=%s done\n", loop ? "true" : "false");
loop = !loop;
}
return 0;
}

View file

@ -38,7 +38,7 @@ create_pipeline (void)
gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
gst_element_link (src, sink);
/**
/**
* now make the bug appear
* I believe it has something to do with 2 chains being created in the scheduler
* but I haven't looked at it yet

View file

@ -1,7 +0,0 @@
include ../Rules
tests_pass = gst-print-formats
tests_fail =
tests_ignore =

View file

@ -1,347 +0,0 @@
/* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
* 2004 Thomas Vander Stichele <thomas@apestaart.org>
*
* gst-inspect.c: tool to inspect the GStreamer registry
*
* 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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <gst/gst.h>
#include "gst/gst-i18n-app.h"
#include <string.h>
#include <locale.h>
#include <glib/gprintf.h>
#define static
static void
print_pad_templates_info (GstElement * element, GstElementFactory * factory,
GstPadDirection dir)
{
GstElementClass *gstelement_class;
const GList *pads;
GstPadTemplate *padtemplate;
if (!factory->numpadtemplates) {
return;
}
gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element));
pads = factory->padtemplates;
while (pads) {
padtemplate = (GstPadTemplate *) (pads->data);
pads = g_list_next (pads);
if (padtemplate->direction == dir) {
if (padtemplate->caps) {
GstStructure *structure;
int i;
for (i = 0; i < gst_caps_get_size (padtemplate->caps); i++) {
structure = gst_caps_get_structure (padtemplate->caps, i);
g_print (" %s\n", gst_structure_get_name (structure));
}
}
}
}
}
static void
print_element_list (const char *klass, GstPadDirection dir)
{
GList *plugins;
g_print ("Elements in %s:\n", klass);
for (plugins = gst_registry_pool_plugin_list (); plugins;
plugins = g_list_next (plugins)) {
GList *features;
GstPlugin *plugin;
plugin = (GstPlugin *) (plugins->data);
features = gst_plugin_get_feature_list (plugin);
while (features) {
GstPluginFeature *feature;
feature = GST_PLUGIN_FEATURE (features->data);
if (GST_IS_ELEMENT_FACTORY (feature)) {
GstElementFactory *factory;
GstElement *element;
factory = GST_ELEMENT_FACTORY (feature);
if (strncmp (factory->details.klass, klass, strlen (klass)) == 0) {
g_print (" %s: %s (%d)\n", GST_PLUGIN_FEATURE_NAME (factory),
factory->details.longname, gst_plugin_feature_get_rank (feature));
element = gst_element_factory_create (factory, NULL);
print_pad_templates_info (element, factory, dir);
gst_object_unref (element);
}
}
features = g_list_next (features);
}
}
g_print ("\n");
}
static void
print_typefind_list (void)
{
GList *plugins;
g_print ("Typefind list:\n");
for (plugins = gst_registry_pool_plugin_list (); plugins;
plugins = g_list_next (plugins)) {
GList *features;
GstPlugin *plugin;
plugin = (GstPlugin *) (plugins->data);
features = gst_plugin_get_feature_list (plugin);
while (features) {
GstPluginFeature *feature;
feature = GST_PLUGIN_FEATURE (features->data);
if (GST_IS_TYPE_FIND_FACTORY (feature)) {
GstTypeFindFactory *factory;
char *s;
gst_plugin_load_file (plugin->filename, NULL);
factory = GST_TYPE_FIND_FACTORY (feature);
g_print (" %s: (%d)\n", GST_PLUGIN_FEATURE_NAME (factory),
gst_plugin_feature_get_rank (feature));
s = gst_caps_to_string (gst_type_find_factory_get_caps (factory));
g_print (" %s\n", s);
g_free (s);
}
features = g_list_next (features);
}
}
g_print ("\n");
}
static int
list_sort_func (gconstpointer a, gconstpointer b)
{
return strcmp ((const char *) a, (const char *) b);
}
static GList *
get_typefind_mime_list (void)
{
GList *plugins;
GList *mime_list = NULL;
for (plugins = gst_registry_pool_plugin_list (); plugins;
plugins = g_list_next (plugins)) {
GList *features;
GstPlugin *plugin;
plugin = (GstPlugin *) (plugins->data);
features = gst_plugin_get_feature_list (plugin);
while (features) {
GstPluginFeature *feature;
feature = GST_PLUGIN_FEATURE (features->data);
if (GST_IS_TYPE_FIND_FACTORY (feature)) {
GstTypeFindFactory *factory;
char *s;
int i;
const GstCaps *caps;
factory = GST_TYPE_FIND_FACTORY (feature);
caps = gst_type_find_factory_get_caps (factory);
if (gst_plugin_feature_get_rank (feature) > 0 && caps != NULL) {
for (i = 0; i < gst_caps_get_size (caps); i++) {
const GstStructure *structure = gst_caps_get_structure (caps, i);
s = g_strdup (gst_structure_get_name (structure));
mime_list = g_list_prepend (mime_list, s);
}
}
}
features = g_list_next (features);
}
}
return mime_list;
}
GList *
g_list_uniqify (GList * list)
{
GList *item;
for (item = g_list_first (list); item; item = g_list_next (item)) {
GList *next_item = g_list_next (item);
while (next_item && strcmp (item->data, next_item->data) == 0) {
g_free (next_item->data);
list = g_list_delete_link (list, next_item);
next_item = g_list_next (item);
}
}
return list;
}
static GList *
get_pad_templates_info (GstElement * element, GstElementFactory * factory,
GstPadDirection dir)
{
GstElementClass *gstelement_class;
const GList *pads;
GstPadTemplate *padtemplate;
GList *mime_list = NULL;
if (!factory->numpadtemplates) {
return NULL;
}
gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element));
pads = factory->padtemplates;
while (pads) {
padtemplate = (GstPadTemplate *) (pads->data);
pads = g_list_next (pads);
if (padtemplate->direction == dir) {
if (padtemplate->caps) {
GstStructure *structure;
int i;
for (i = 0; i < gst_caps_get_size (padtemplate->caps); i++) {
structure = gst_caps_get_structure (padtemplate->caps, i);
mime_list = g_list_prepend (mime_list,
g_strdup (gst_structure_get_name (structure)));
}
}
}
}
return mime_list;
}
static GList *
get_element_mime_list (const char *klass, GstPadDirection dir)
{
GList *mime_list = NULL;
GList *plugins;
for (plugins = gst_registry_pool_plugin_list (); plugins;
plugins = g_list_next (plugins)) {
GList *features;
GstPlugin *plugin;
plugin = (GstPlugin *) (plugins->data);
features = gst_plugin_get_feature_list (plugin);
while (features) {
GstPluginFeature *feature;
feature = GST_PLUGIN_FEATURE (features->data);
if (GST_IS_ELEMENT_FACTORY (feature)) {
GstElementFactory *factory;
GstElement *element;
factory = GST_ELEMENT_FACTORY (feature);
if (strncmp (factory->details.klass, klass, strlen (klass)) == 0) {
if (gst_plugin_feature_get_rank (feature) > 0) {
GList *list;
element = gst_element_factory_create (factory, NULL);
list = get_pad_templates_info (element, factory, dir);
mime_list = g_list_concat (mime_list, list);
gst_object_unref (element);
}
}
}
features = g_list_next (features);
}
}
return mime_list;
}
static void
print_mime_list (void)
{
GList *list;
GList *typefind_list;
GList *item;
GList *item2;
typefind_list = get_typefind_mime_list ();
typefind_list = g_list_sort (typefind_list, list_sort_func);
typefind_list = g_list_uniqify (typefind_list);
list = get_element_mime_list ("Codec/Demuxer", GST_PAD_SINK);
list = g_list_concat (list, get_element_mime_list ("Codec/Decoder",
GST_PAD_SINK));
list = g_list_sort (list, list_sort_func);
list = g_list_uniqify (list);
g_print ("MIME media type list:\n");
for (item = g_list_first (list); item; item = g_list_next (item)) {
for (item2 = g_list_first (typefind_list); item2;
item2 = g_list_next (item2)) {
if (strcmp ((char *) item->data, (char *) item2->data) == 0) {
g_print (" %s\n", (char *) item->data);
}
}
}
}
int
main (int argc, char *argv[])
{
#ifdef GETTEXT_PACKAGE
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
#endif
gst_init (&argc, &argv);
print_element_list ("Codec/Demuxer", GST_PAD_SINK);
print_element_list ("Codec/Decoder", GST_PAD_SINK);
print_element_list ("Codec/Muxer", GST_PAD_SRC);
print_element_list ("Codec/Encoder", GST_PAD_SRC);
print_typefind_list ();
print_mime_list ();
return 0;
}

View file

@ -1,17 +0,0 @@
group_link
relink_sink
relink_src
unlink_sink
unlink_src
unref_sink
unref_src
useless_iteration
143777
143777-2
142183
142183-2
147713
147819
147894
147894-2
queue_link

View file

@ -1,73 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gst/gst.h>
static void
handoff_identity (GstElement * element)
{
GstBin *parent;
parent = GST_BIN (gst_element_get_parent (element));
g_print ("identity handoff\n");
/* element is unreffed and destroyed here, which will cause
* an assert */
gst_bin_remove (parent, element);
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *id;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
id = gst_element_factory_make ("identity", NULL);
g_assert (id);
g_signal_connect (G_OBJECT (id), "handoff", (GCallback) handoff_identity,
NULL);
g_object_set (G_OBJECT (id), "loop-based", TRUE, NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, id, sink, NULL);
gst_element_link_pads (src, "src", id, "sink");
gst_element_link_pads (id, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
g_print ("got past iteration, scheduler refs elements correctly\n");
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
src = id = sink = pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,95 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <unistd.h>
#include <gst/gst.h>
static void
handoff_identity (GstElement * element)
{
GstBin *parent;
parent = GST_BIN (gst_element_get_parent (element));
g_print ("identity handoff\n");
gst_bin_remove (parent, element);
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *id;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
id = gst_element_factory_make ("identity", NULL);
g_assert (id);
/* ref object here as it will be unparented and destroyed in the
* handoff signal, normally the scheduler should keep a ref to the
* currently scheduled elements but that's another bug displayed in
* 142183-2.c */
gst_object_ref (id);
g_signal_connect (G_OBJECT (id), "handoff", (GCallback) handoff_identity,
NULL);
g_object_set (G_OBJECT (id), "loop-based", TRUE, NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, id, sink, NULL);
/* this is what triggers the bug */
gst_element_enable_threadsafe_properties (GST_ELEMENT (src));
gst_element_enable_threadsafe_properties (GST_ELEMENT (id));
gst_element_enable_threadsafe_properties (GST_ELEMENT (sink));
gst_element_link_pads (src, "src", id, "sink");
gst_element_link_pads (id, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
/* 'cause we're going into deadlock mode */
alarm (5);
g_print ("adding identity back...\n");
/* add identity back in */
gst_bin_add_many (GST_BIN (pipeline), id, NULL);
g_print ("going into possible deadlock... alarm at 5 seconds\n");
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
g_print ("ok, no deadlock. bug 142183 fixed!\n");
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
gst_object_unref (id);
src = id = sink = pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,64 +0,0 @@
#include <gst/gst.h>
int
main (int argc, char **argv)
{
GstElement *src, *sink, *enc, *tee;
GstElement *pipeline;
int i;
gst_init (&argc, &argv);
pipeline = gst_element_factory_make ("pipeline", "pipeline");
src = gst_element_factory_make ("fakesrc", "src");
g_assert (src);
tee = gst_element_factory_make ("tee", "tee1");
g_assert (tee);
enc = gst_element_factory_make ("identity", "enc");
g_assert (enc);
sink = gst_element_factory_make ("fakesink", "sink");
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, tee, enc, sink, NULL);
if (!gst_element_link_many (src, tee, enc, sink, NULL))
g_assert_not_reached ();
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
for (i = 0; i < 5; i++) {
if (!gst_bin_iterate (GST_BIN (pipeline)))
g_assert_not_reached ();
g_print ("%d\n", i);
}
if (gst_element_set_state (pipeline,
GST_STATE_PAUSED) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
gst_element_unlink_many (tee, enc, sink, NULL);
gst_bin_remove_many (GST_BIN (pipeline), enc, sink, NULL);
enc = gst_element_factory_make ("identity", "enc");
g_assert (enc);
sink = gst_element_factory_make ("fakesink", "sink");
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), enc, sink, NULL);
if (!gst_element_link_many (tee, enc, sink, NULL))
g_assert_not_reached ();
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
for (i = 5; i < 10; i++) {
if (!gst_bin_iterate (GST_BIN (pipeline)))
g_assert_not_reached ();
g_print ("%d\n", i);
}
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
g_print ("done.\n");
return 0;
}

View file

@ -1,73 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Benjamin Otte <otte@gnome.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* This file reproduces the bug in the bugreport #143777, as can be seen at
* http://bugzilla.gnome.org/show_bug.cgi?id=143777 - the issue is that when
* pausing a pipeline while the chainhandler is still running, then unlinking
* the pad that's chain function is called and relinking it clears the buffer
* that was stored for sending the event. gst_pad_call_chain_function needs
* to check that.
* The fix is in gstpad.c, revision 1.327
*/
#include <gst/gst.h>
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *id;
guint i = 0, j;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
id = gst_element_factory_make ("identity", NULL);
g_assert (id);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, id, sink, NULL);
while (i < 100) {
g_print ("running... (%d iterations)\n", i);
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
gst_element_link_many (src, id, sink, NULL);
for (j = 0; j < i; j++)
gst_bin_iterate (GST_BIN (pipeline));
if (gst_element_set_state (pipeline,
GST_STATE_PAUSED) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
gst_element_unlink_many (src, id, sink, NULL);
i++;
}
g_print ("cleaning up...\n");
g_assert (i == 100);
gst_object_unref (pipeline);
src = id = sink = pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,92 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymanse <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gst/gst.h>
static gint src_handoff = 0;
static void
handoff_src (GstElement * element)
{
g_print ("src handoff\n");
src_handoff++;
}
static void
handoff_sink (GstElement * element)
{
g_print ("sink handoff\n");
g_assert (src_handoff == 1);
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *id1, *id2;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
g_object_set (G_OBJECT (src), "signal-handoffs", TRUE, NULL);
g_signal_connect (G_OBJECT (src), "handoff", (GCallback) handoff_src, NULL);
id1 = gst_element_factory_make ("identity", NULL);
g_assert (id1);
id2 = gst_element_factory_make ("identity", NULL);
g_assert (id2);
g_object_set (G_OBJECT (id2), "loop-based", TRUE, NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL);
g_signal_connect (G_OBJECT (sink), "handoff", (GCallback) handoff_sink, NULL);
gst_bin_add_many (GST_BIN (pipeline), src, id1, NULL);
gst_element_link_pads (src, "src", id1, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
if (gst_element_set_state (id2,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
if (gst_element_set_state (sink,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
gst_bin_add_many (GST_BIN (pipeline), sink, NULL);
gst_element_link_pads (id2, "src", sink, "sink");
gst_element_link_pads (id1, "src", id2, "sink");
gst_bin_add_many (GST_BIN (pipeline), id2, NULL);
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
src = id1 = id2 = sink = pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,101 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <unistd.h>
#include <gst/gst.h>
static gboolean handoff;
static void
handoff_identity1 (GstElement * element)
{
g_print ("identity1 handoff\n");
handoff = TRUE;
}
static void
handoff_identity2 (GstElement * element)
{
g_print ("identity2 handoff\n");
handoff = TRUE;
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *id1, *id2;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
id1 = gst_element_factory_make ("identity", NULL);
g_assert (id1);
g_object_set (G_OBJECT (id1), "loop-based", TRUE, NULL);
g_object_set (G_OBJECT (id1), "duplicate", 3, NULL);
g_signal_connect (G_OBJECT (id1), "handoff", (GCallback) handoff_identity1,
NULL);
id2 = gst_element_factory_make ("identity", NULL);
g_assert (id2);
g_object_set (G_OBJECT (id2), "loop-based", TRUE, NULL);
g_signal_connect (G_OBJECT (id2), "handoff", (GCallback) handoff_identity2,
NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, id1, id2, sink, NULL);
gst_element_link_pads (src, "src", id1, "sink");
gst_element_link_pads (id1, "src", id2, "sink");
gst_element_link_pads (id2, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("running...\n");
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
/* do ugly stuff here */
gst_object_ref (id1);
gst_bin_remove (GST_BIN (pipeline), id1);
gst_element_link_pads (src, "src", id1, "sink");
gst_element_link_pads (id1, "src", id2, "sink");
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
src = id1 = id2 = sink = pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,138 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <unistd.h>
#include <gst/gst.h>
static gboolean empty;
static gboolean bug;
static gboolean handoff;
static GstElement *pipeline2;
static void
queue_empty (GstElement * element)
{
g_print ("queue empty\n");
if (!handoff)
bug = TRUE;
}
static void
queue_filled (GstElement * element)
{
g_print ("queue filled\n");
empty = FALSE;
/* read from the other end */
handoff = FALSE;
bug = FALSE;
alarm (5);
g_print ("emptying queue with 5 second timeout...\n");
while (!bug && !handoff) {
gst_bin_iterate (GST_BIN (pipeline2));
}
}
static void
handoff_identity (GstElement * element)
{
g_print ("identity handoff\n");
handoff = TRUE;
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *queue, *id;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
queue = gst_element_factory_make ("queue", NULL);
g_assert (queue);
g_signal_connect (G_OBJECT (queue), "overrun", (GCallback) queue_filled,
NULL);
g_signal_connect (G_OBJECT (queue), "underrun", (GCallback) queue_empty,
NULL);
gst_bin_add_many (GST_BIN (pipeline), src, queue, NULL);
gst_element_link_pads (src, "src", queue, "sink");
/* second pipeline for sinks */
pipeline2 = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline2);
id = gst_element_factory_make ("identity", NULL);
g_assert (id);
g_signal_connect (G_OBJECT (id), "handoff", (GCallback) handoff_identity,
NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline2), id, sink, NULL);
gst_element_link_pads (queue, "src", id, "sink");
gst_element_link_pads (id, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
if (gst_element_set_state (pipeline2,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("running...\n");
/* fill queue */
empty = TRUE;
while (empty) {
gst_bin_iterate (GST_BIN (pipeline));
}
g_assert (!bug);
g_print ("relinking...\n");
/* now unlink and link id and sink */
gst_element_unlink_pads (id, "src", sink, "sink");
gst_element_link_pads (id, "src", sink, "sink");
g_print ("running again...\n");
/* fill queue */
empty = TRUE;
while (empty) {
gst_bin_iterate (GST_BIN (pipeline));
}
g_assert (!bug);
/* trigger the bug */
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
gst_object_unref (pipeline2);
src = id = sink = pipeline = pipeline2 = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,146 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <unistd.h>
#include <gst/gst.h>
static gboolean empty;
static gboolean bug;
static gboolean handoff;
static GstElement *pipeline2;
static void
queue_empty (GstElement * element)
{
g_print ("queue empty\n");
if (!handoff)
bug = TRUE;
}
static void
queue_filled (GstElement * element)
{
g_print ("queue filled\n");
empty = FALSE;
/* read from the other end */
handoff = FALSE;
bug = FALSE;
alarm (5);
g_print ("emptying queue with 5 second timeout...\n");
while (!bug && !handoff) {
gst_bin_iterate (GST_BIN (pipeline2));
}
}
static void
handoff_identity (GstElement * element)
{
g_print ("identity handoff\n");
handoff = TRUE;
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *queue, *id;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
queue = gst_element_factory_make ("queue", NULL);
g_assert (queue);
g_signal_connect (G_OBJECT (queue), "overrun", (GCallback) queue_filled,
NULL);
g_signal_connect (G_OBJECT (queue), "underrun", (GCallback) queue_empty,
NULL);
gst_bin_add_many (GST_BIN (pipeline), src, queue, NULL);
gst_element_link_pads (src, "src", queue, "sink");
/* second pipeline for sinks */
pipeline2 = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline2);
id = gst_element_factory_make ("identity", NULL);
g_assert (id);
g_signal_connect (G_OBJECT (id), "handoff", (GCallback) handoff_identity,
NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline2), id, sink, NULL);
gst_element_link_pads (queue, "src", id, "sink");
gst_element_link_pads (id, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
if (gst_element_set_state (pipeline2,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("running...\n");
/* fill queue */
empty = TRUE;
while (empty) {
gst_bin_iterate (GST_BIN (pipeline));
}
g_assert (!bug);
if (gst_element_set_state (pipeline2,
GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("relinking...\n");
/* now unlink and link id and sink */
gst_element_unlink_pads (id, "src", sink, "sink");
gst_element_link_pads (id, "src", sink, "sink");
if (gst_element_set_state (pipeline2,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("running again...\n");
/* fill queue */
empty = TRUE;
while (empty) {
gst_bin_iterate (GST_BIN (pipeline));
}
g_assert (!bug);
/* trigger the bug */
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
gst_object_unref (pipeline2);
src = id = sink = pipeline = pipeline2 = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,30 +0,0 @@
include ../Rules
tests_pass = \
unlink_src unlink_sink \
relink_src relink_sink \
unref_src unref_sink \
142183 142183-2 \
143777 143777-2 \
147713 \
147819 \
147894 147894-2 group_link \
queue_link
# don't enable this one unless it actually works.
# useless_iteration
tests_fail =
tests_ignore =
unlink_src_SOURCES = unlink.c
unlink_src_CFLAGS = $(AM_CFLAGS) -DELEMENT=src
unlink_sink_SOURCES = unlink.c
unlink_sink_CFLAGS = $(AM_CFLAGS) -DELEMENT=sink
relink_src_SOURCES = relink.c
relink_src_CFLAGS = $(AM_CFLAGS) -DELEMENT=src -DOTHER_ELEMENT=sink
relink_sink_SOURCES = relink.c
relink_sink_CFLAGS = $(AM_CFLAGS) -DELEMENT=sink -DOTHER_ELEMENT=src
unref_src_SOURCES = unref.c
unref_src_CFLAGS = $(AM_CFLAGS) -DELEMENT=src
unref_sink_SOURCES = unref.c
unref_sink_CFLAGS = $(AM_CFLAGS) -DELEMENT=sink

View file

@ -1,67 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <unistd.h>
#include <gst/gst.h>
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *id1, *id2, *sink;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
id1 = gst_element_factory_make ("identity", NULL);
g_assert (id1);
id2 = gst_element_factory_make ("identity", NULL);
g_assert (id2);
g_object_set (G_OBJECT (id2), "loop-based", TRUE, NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, id1, id2, sink, NULL);
/* link is not accounted for here... */
gst_element_link_pads (id1, "src", id2, "sink");
gst_element_link_pads (src, "src", id1, "sink");
gst_element_link_pads (id2, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("running...\n");
/* fill queue */
gst_bin_iterate (GST_BIN (pipeline));
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
src = id1 = id2 = sink = pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,69 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <unistd.h>
#include <gst/gst.h>
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *thread, *bin, *src, *queue, *id1, *sink;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
queue = gst_element_factory_make ("queue", NULL);
g_assert (queue);
thread = gst_element_factory_make ("thread", NULL);
g_assert (thread);
bin = gst_element_factory_make ("bin", NULL);
g_assert (bin);
id1 = gst_element_factory_make ("identity", NULL);
g_assert (id1);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (bin), id1, sink, NULL);
gst_bin_add_many (GST_BIN (thread), bin, NULL);
gst_bin_add_many (GST_BIN (pipeline), src, queue, thread, NULL);
gst_element_link_pads (src, "src", queue, "sink");
gst_element_link_pads (queue, "src", id1, "sink");
gst_element_link_pads (id1, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("unlinking...\n");
gst_object_ref (queue);
gst_bin_remove (GST_BIN (pipeline), queue);
gst_object_ref (bin);
gst_bin_remove (GST_BIN (thread), bin);
g_print ("done.\n");
return 0;
}

View file

@ -1,74 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gst/gst.h>
GstElement *pipeline, *src, *sink;
static void
cb_handoff (GstElement * element, GstBuffer * buffer, GstPad * pad,
gpointer unused)
{
if (GST_PAD_PEER (pad)) {
g_print ("relinking...\n");
gst_pad_unlink (pad, GST_PAD_PEER (pad));
gst_bin_remove (GST_BIN (pipeline), OTHER_ELEMENT);
OTHER_ELEMENT =
gst_element_factory_make ("fake" G_STRINGIFY (OTHER_ELEMENT), NULL);
g_assert (OTHER_ELEMENT);
gst_bin_add (GST_BIN (pipeline), OTHER_ELEMENT);
gst_element_sync_state_with_parent (OTHER_ELEMENT);
gst_element_link (ELEMENT, OTHER_ELEMENT);
}
}
gint
main (gint argc, gchar ** argv)
{
guint i = 0;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
gst_element_link (src, sink);
/* setup special stuff */
g_object_set (ELEMENT, "signal-handoffs", TRUE, NULL);
g_signal_connect (ELEMENT, "handoff", (GCallback) cb_handoff, NULL);
/* run pipeline */
g_print ("running...\n");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
while (i++ < 10 && gst_bin_iterate (GST_BIN (pipeline)));
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,65 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gst/gst.h>
static void
cb_handoff (GstElement * element, GstBuffer * buffer, GstPad * pad,
gpointer unused)
{
if (GST_PAD_PEER (pad)) {
g_print ("unlinking...\n");
gst_pad_unlink (pad, GST_PAD_PEER (pad));
}
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
gst_element_link (src, sink);
/* setup special stuff */
g_object_set (ELEMENT, "signal-handoffs", TRUE, NULL);
g_signal_connect (ELEMENT, "handoff", (GCallback) cb_handoff, NULL);
/* run pipeline */
g_print ("running...\n");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
while (gst_bin_iterate (GST_BIN (pipeline)));
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,62 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gst/gst.h>
GstElement *pipeline, *src, *sink;
static void
cb_handoff (GstElement * element, GstBuffer * buffer, GstPad * pad,
gpointer unused)
{
if (pipeline) {
g_print ("unreffing...\n");
gst_object_unref (pipeline);
pipeline = NULL;
}
}
gint
main (gint argc, gchar ** argv)
{
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
gst_element_link (src, sink);
/* setup special stuff */
g_object_set (ELEMENT, "signal-handoffs", TRUE, NULL);
g_signal_connect (ELEMENT, "handoff", (GCallback) cb_handoff, NULL);
/* run pipeline */
g_print ("running...\n");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
while (pipeline && gst_bin_iterate (GST_BIN (pipeline)));
g_print ("done.\n");
return 0;
}

View file

@ -1,51 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gst/gst.h>
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline;
GError *error = NULL;
guint i = 0;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_parse_launch ("pipeline.( { fakesrc ! fakesink } )", &error);
g_assert (error == NULL);
g_assert (pipeline);
/* run pipeline */
g_print ("running...\n");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
while (i < 100 && gst_bin_iterate (GST_BIN (pipeline)))
i++;
g_print ("cleaning up... (%d iterations)\n", i);
g_assert (i == 100);
gst_object_unref (pipeline);
pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,7 +1,7 @@
/* GStreamer
* Copyright (C) <2004> Benjamin Otte <otte@gnome.org>
*
* bin.c:
* bin.c:
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public

View file

@ -14,20 +14,20 @@ GST_DEBUG_DIRS = debug
endif
SUBDIRS = \
bytestream caps cleanup controller \
caps \
$(GST_DEBUG_DIRS) \
dlopen \
elements indexers negotiation pad \
elements indexers \
$(GST_PARSE_DIRS) \
plugin refcounting schedulers states threads trigger
plugin refcounting states threads trigger
DIST_SUBDIRS = \
bytestream caps cleanup controller \
caps \
debug \
dlopen \
elements indexers negotiation pad \
elements indexers \
parse \
plugin refcounting schedulers states threads trigger
plugin refcounting states threads trigger
tests_pass =
tests_fail =

View file

@ -1,9 +0,0 @@
Makefile
Makefile.in
*.o
*.lo
*.la
.deps
.libs
test1
filepadsink

View file

@ -1,11 +0,0 @@
include ../Rules
tests_pass = filepadsink
tests_fail = test1
tests_ignore =
test1_SOURCES = test1.c gstbstest.c
test1_LDFLAGS = $(top_builddir)/libs/gst/bytestream/libgstbytestream.la
filepadsink_CFLAGS = $(AM_CFLAGS) -DTHE_FILE=\""$(top_srcdir)/configure.ac"\"
filepadsink_LDFLAGS = $(top_builddir)/libs/gst/bytestream/libgstbytestream.la

View file

@ -1,282 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Benjamin Otte <otte@gnome.org>
*
* 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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <gst/gst.h>
#include <gst/bytestream/filepad.h>
#include <stdio.h>
#include <string.h>
#define GST_TYPE_FP_SINK \
(gst_fp_sink_get_type())
#define GST_FP_SINK(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_FP_SINK,GstFpSink))
#define GST_FP_SINK_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_FP_SINK,GstFpSinkClass))
#define GST_IS_FP_SINK(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FP_SINK))
#define GST_IS_FP_SINK_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FP_SINK))
typedef struct _GstFpSink GstFpSink;
typedef struct _GstFpSinkClass GstFpSinkClass;
struct _GstFpSink
{
GstElement element;
/* pads */
GstFilePad *sinkpad;
/* fd */
FILE *stream;
guint state;
};
struct _GstFpSinkClass
{
GstElementClass parent_class;
};
GST_BOILERPLATE (GstFpSink, gst_fp_sink, GstElement, GST_TYPE_ELEMENT);
static void do_tests (GstFilePad * pad);
static void
gst_fp_sink_base_init (gpointer g_class)
{
}
static void
gst_fp_sink_class_init (GstFpSinkClass * klass)
{
}
static GstStaticPadTemplate template = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS ("ANY")
);
static void
gst_fp_sink_init (GstFpSink * fp)
{
GST_OBJECT_FLAG_SET (fp, GST_ELEMENT_EVENT_AWARE);
fp->sinkpad =
GST_FILE_PAD (gst_file_pad_new (gst_static_pad_template_get (&template),
"sink"));
gst_file_pad_set_iterate_function (fp->sinkpad, do_tests);
gst_element_add_pad (GST_ELEMENT (fp), GST_PAD (fp->sinkpad));
}
#define THE_CHECK(result) G_STMT_START{ \
gint64 pos = gst_file_pad_tell(fp->sinkpad); \
if (pos >= 0) \
g_assert (pos == ftell (fp->stream)); \
g_print ("%s (%"G_GINT64_FORMAT")\n", result ? "OK" : "no", pos); \
return result; \
}G_STMT_END
#define FAIL THE_CHECK(FALSE)
#define SUCCESS THE_CHECK(TRUE)
static gboolean
fp_read (GstFpSink * fp, guint size)
{
guint8 buf[size], buf2[size];
gint64 amount;
g_print ("reading %u bytes...", size);
amount = gst_file_pad_read (fp->sinkpad, buf, size);
if (amount == -EAGAIN)
FAIL;
g_assert (amount == size);
amount = fread (buf2, 1, amount, fp->stream);
g_assert (amount == size);
if (memcmp (buf, buf2, amount) != 0)
g_assert_not_reached ();
fp->state++;
SUCCESS;
}
static gboolean
fp_try_read (GstFpSink * fp, guint size)
{
guint8 buf[size], buf2[size];
gint64 amount;
size_t amount2;
g_print ("reading %u bytes...", size);
amount = gst_file_pad_try_read (fp->sinkpad, buf, size);
if (amount == -EAGAIN)
FAIL;
g_assert (amount > 0);
amount2 = fread (buf2, 1, amount, fp->stream);
g_assert (amount == amount2);
if (memcmp (buf, buf2, amount) != 0)
g_assert_not_reached ();
fp->state++;
SUCCESS;
}
static gboolean
fp_seek (GstFpSink * fp, gint64 pos, GstSeekType whence)
{
int seek_type = whence == GST_SEEK_METHOD_SET ? SEEK_SET :
whence == GST_SEEK_METHOD_CUR ? SEEK_CUR : SEEK_END;
g_print ("seeking to %s %" G_GINT64_FORMAT " bytes...",
whence == GST_SEEK_METHOD_SET ? "" : whence ==
GST_SEEK_METHOD_CUR ? "+-" : "-", pos);
if (gst_file_pad_seek (fp->sinkpad, pos, whence) != 0)
g_assert_not_reached ();
if (fseek (fp->stream, pos, seek_type) != 0)
g_assert_not_reached ();
fp->state++;
SUCCESS;
}
static gboolean
fp_eof (GstFpSink * fp)
{
guint8 buf;
g_print ("checking for EOF...");
if (!gst_file_pad_eof (fp->sinkpad))
FAIL;
if (fread (&buf, 1, 1, fp->stream) != 0)
g_assert_not_reached ();
fp->state++;
SUCCESS;
}
#define MIN_SIZE 10050
#define MAX_SIZE 1000000
static void
do_tests (GstFilePad * pad)
{
GstFpSink *fp = GST_FP_SINK (gst_pad_get_parent (GST_PAD (pad)));
while (TRUE) {
switch (fp->state) {
case 0:
if (!fp_try_read (fp, 50))
return;
break;
case 1:
if (!fp_try_read (fp, MAX_SIZE)) /* more than file size */
return;
break;
case 2:
if (!fp_seek (fp, 0, GST_SEEK_METHOD_SET))
return;
break;
case 3:
if (!fp_read (fp, 50))
return;
break;
case 4:
if (!fp_read (fp, MIN_SIZE - 50)) /* bigger than 1 buffer */
return;
break;
case 5:
if (!fp_seek (fp, -200, GST_SEEK_METHOD_CUR))
return;
break;
case 6:
if (!fp_read (fp, 50))
return;
break;
case 7:
if (!fp_seek (fp, 50, GST_SEEK_METHOD_CUR))
return;
break;
case 8:
if (!fp_read (fp, 50))
return;
break;
case 9:
if (!fp_seek (fp, MIN_SIZE - 50, GST_SEEK_METHOD_SET))
return;
break;
case 10:
if (!fp_read (fp, 50))
return;
break;
case 11:
if (!fp_seek (fp, 0, GST_SEEK_METHOD_END))
return;
break;
case 12:
if (!fp_eof (fp))
return;
gst_element_set_eos (GST_ELEMENT (fp));
return;
default:
g_assert_not_reached ();
}
}
}
#ifndef THE_FILE
# define THE_FILE "../../configure.ac"
#endif
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink;
long size;
gst_init (&argc, &argv);
gst_library_load ("gstbytestream");
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("filesrc", NULL);
g_assert (src);
sink = g_object_new (GST_TYPE_FP_SINK, NULL);
gst_object_set_name (GST_OBJECT (sink), "sink");
gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
if (!gst_element_link (src, sink))
g_assert_not_reached ();
g_object_set (src, "location", THE_FILE, NULL);
GST_FP_SINK (sink)->stream = fopen (THE_FILE, "rb");
g_assert (GST_FP_SINK (sink)->stream);
/* check correct file sizes */
if (fseek (GST_FP_SINK (sink)->stream, 0, SEEK_END) != 0)
g_assert_not_reached ();
size = ftell (GST_FP_SINK (sink)->stream);
if (fseek (GST_FP_SINK (sink)->stream, 0, SEEK_SET) != 0)
g_assert_not_reached ();
g_assert (size >= MIN_SIZE);
g_assert (size <= MAX_SIZE);
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
while (gst_bin_iterate (GST_BIN (pipeline)));
g_assert (GST_FP_SINK (sink)->state == 13);
g_object_unref (pipeline);
pipeline = NULL;
return 0;
}

View file

@ -1,418 +0,0 @@
/* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
*
* gstbstest.c:
*
* 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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <stdlib.h>
#include <string.h>
#include <gst/gst.h>
#include <gst/bytestream/bytestream.h>
#define GST_TYPE_BSTEST (gst_bstest_get_type())
#define GST_BSTEST(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_BSTEST,GstBsTest))
#define GST_BSTEST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_BSTEST,GstBsTestClass))
#define GST_IS_BSTEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_BSTEST))
#define GST_IS_BSTEST_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BSTEST))
typedef struct _GstBsTest GstBsTest;
typedef struct _GstBsTestClass GstBsTestClass;
struct _GstBsTest
{
GstElement element;
GstPad *sinkpad;
GstPad *srcpad;
GstByteStream *bs;
gchar *accesspattern;
guint num_patterns;
gchar **patterns;
guint sizemin;
guint sizemax;
gint count;
gboolean silent;
};
struct _GstBsTestClass
{
GstElementClass parent_class;
};
GType gst_bstest_get_type (void);
GstElementDetails gst_bstest_details = GST_ELEMENT_DETAILS ("ByteStreamTest",
"Filter",
"Test for the GstByteStream code",
"Erik Walthinsen <omega@temple-baptist.com>, "
"Wim Taymans <wim.taymans@chello.be>");
/* BsTest signals and args */
enum
{
/* FILL ME */
LAST_SIGNAL
};
enum
{
ARG_0,
ARG_SIZEMIN,
ARG_SIZEMAX,
ARG_COUNT,
ARG_SILENT,
ARG_ACCESSPATTERN,
};
static void gst_bstest_base_init (gpointer g_class);
static void gst_bstest_class_init (GstBsTestClass * klass);
static void gst_bstest_init (GstBsTest * bstest);
static void gst_bstest_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_bstest_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
static GstStateChangeReturn gst_bstest_change_state (GstElement * element,
GstStateChange transition);
static void gst_bstest_loop (GstElement * element);
static GstElementClass *parent_class = NULL;
/* static guint gst_bstest_signals[LAST_SIGNAL] = { 0 }; */
GType
gst_bstest_get_type (void)
{
static GType bstest_type = 0;
if (!bstest_type) {
static const GTypeInfo bstest_info = {
sizeof (GstBsTestClass),
gst_bstest_base_init,
NULL,
(GClassInitFunc) gst_bstest_class_init,
NULL,
NULL,
sizeof (GstBsTest),
0,
(GInstanceInitFunc) gst_bstest_init,
};
bstest_type =
g_type_register_static (GST_TYPE_ELEMENT, "BSTest", &bstest_info, 0);
}
return bstest_type;
}
static void
gst_bstest_base_init (gpointer g_class)
{
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class);
gst_element_class_set_details (gstelement_class, &gst_bstest_details);
}
static void
gst_bstest_class_init (GstBsTestClass * klass)
{
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
gobject_class = (GObjectClass *) klass;
gstelement_class = (GstElementClass *) klass;
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SIZEMIN,
g_param_spec_int ("sizemin", "sizemin", "sizemin", 0, G_MAXINT,
0, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SIZEMAX,
g_param_spec_int ("sizemax", "sizemax", "sizemax", 0, G_MAXINT,
384, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ACCESSPATTERN,
g_param_spec_string ("accesspattern", "accesspattern", "accesspattern",
"r", G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_COUNT,
g_param_spec_uint ("count", "count", "count",
0, G_MAXUINT, 0, G_PARAM_READWRITE));
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_SILENT,
g_param_spec_boolean ("silent", "silent", "silent",
FALSE, G_PARAM_READWRITE));
gobject_class->set_property = GST_DEBUG_FUNCPTR (gst_bstest_set_property);
gobject_class->get_property = GST_DEBUG_FUNCPTR (gst_bstest_get_property);
gstelement_class->change_state = gst_bstest_change_state;
}
static GstCaps *
gst_bstest_getcaps (GstPad * pad)
{
GstBsTest *bstest = GST_BSTEST (gst_pad_get_parent (pad));
GstPad *otherpad;
otherpad = (pad == bstest->srcpad) ? bstest->sinkpad : bstest->srcpad;
return gst_pad_get_allowed_caps (otherpad);
}
GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS_ANY);
GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS_ANY);
static void
gst_bstest_init (GstBsTest * bstest)
{
bstest->sinkpad =
gst_pad_new_from_template (gst_static_pad_template_get (&sinktemplate),
"sink");
gst_element_add_pad (GST_ELEMENT (bstest), bstest->sinkpad);
gst_pad_set_getcaps_function (bstest->sinkpad, gst_bstest_getcaps);
bstest->srcpad =
gst_pad_new_from_template (gst_static_pad_template_get (&srctemplate),
"src");
gst_element_add_pad (GST_ELEMENT (bstest), bstest->srcpad);
gst_pad_set_getcaps_function (bstest->srcpad, gst_bstest_getcaps);
gst_element_set_loop_function (GST_ELEMENT (bstest), gst_bstest_loop);
bstest->sizemin = 0;
bstest->sizemax = 384;
bstest->accesspattern = g_strdup ("r");
bstest->patterns = g_strsplit (bstest->accesspattern, ":", 0);
bstest->count = 5;
bstest->silent = FALSE;
bstest->bs = NULL;
}
static guint
gst_bstest_get_size (GstBsTest * bstest, gchar * sizestring, guint prevsize)
{
guint size;
if (sizestring[0] == 0) {
size = bstest->sizemax;
} else if (sizestring[0] == 'r') {
size =
bstest->sizemin +
(guint8) (((gfloat) bstest->sizemax) * rand () / (RAND_MAX +
(gfloat) bstest->sizemin));
} else if (sizestring[0] == '<') {
size = prevsize;
} else {
size = atoi (sizestring);
}
if (size == 0)
size++;
return size;
}
static void
gst_bstest_loop (GstElement * element)
{
GstBsTest *bstest;
GstBuffer *buf = NULL;
g_return_if_fail (element != NULL);
g_return_if_fail (GST_IS_BSTEST (element));
bstest = GST_BSTEST (element);
do {
guint size = 0;
guint i = 0;
guint8 *ptr;
while (i < bstest->num_patterns) {
buf = NULL;
if (bstest->patterns[i][0] == 'r') {
size = gst_bstest_get_size (bstest, &bstest->patterns[i][1], size);
if (!bstest->silent)
g_print ("bstest: ***** read %d bytes\n", size);
gst_bytestream_read (bstest->bs, &buf, size);
} else if (bstest->patterns[i][0] == 'f') {
size = gst_bstest_get_size (bstest, &bstest->patterns[i][1], size);
if (!bstest->silent)
g_print ("bstest: ***** flush %d bytes\n", size);
gst_bytestream_flush (bstest->bs, size);
} else if (!strncmp (bstest->patterns[i], "pb", 2)) {
size = gst_bstest_get_size (bstest, &bstest->patterns[i][2], size);
if (!bstest->silent)
g_print ("bstest: ***** peek bytes %d bytes\n", size);
gst_bytestream_peek_bytes (bstest->bs, &ptr, size);
} else if (bstest->patterns[i][0] == 'p') {
size = gst_bstest_get_size (bstest, &bstest->patterns[i][1], size);
if (!bstest->silent)
g_print ("bstest: ***** peek %d bytes\n", size);
gst_bytestream_peek (bstest->bs, &buf, size);
gst_buffer_unref (buf);
buf = NULL;
}
if (buf)
gst_pad_push (bstest->srcpad, GST_DATA (buf));
i++;
}
/* } while (!GST_ELEMENT_IS_COTHREAD_STOPPING (element)); */
} while (0);
}
static void
gst_bstest_set_property (GObject * object, guint prop_id, const GValue * value,
GParamSpec * pspec)
{
GstBsTest *bstest;
g_return_if_fail (GST_IS_BSTEST (object));
bstest = GST_BSTEST (object);
switch (prop_id) {
case ARG_SIZEMIN:
bstest->sizemin = g_value_get_int (value);
break;
case ARG_SIZEMAX:
bstest->sizemax = g_value_get_int (value);
break;
case ARG_ACCESSPATTERN:
if (bstest->accesspattern) {
g_free (bstest->accesspattern);
g_strfreev (bstest->patterns);
}
if (g_value_get_string (value) == NULL) {
gst_element_set_state (GST_ELEMENT (object), GST_STATE_NULL);
bstest->accesspattern = NULL;
bstest->num_patterns = 0;
} else {
guint i = 0;
bstest->accesspattern = g_strdup (g_value_get_string (value));
bstest->patterns = g_strsplit (bstest->accesspattern, ":", 0);
while (bstest->patterns[i++]);
bstest->num_patterns = i - 1;
}
break;
case ARG_COUNT:
bstest->count = g_value_get_uint (value);
break;
case ARG_SILENT:
bstest->silent = g_value_get_boolean (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
gst_bstest_get_property (GObject * object, guint prop_id, GValue * value,
GParamSpec * pspec)
{
GstBsTest *bstest;
g_return_if_fail (GST_IS_BSTEST (object));
bstest = GST_BSTEST (object);
switch (prop_id) {
case ARG_SIZEMIN:
g_value_set_int (value, bstest->sizemin);
break;
case ARG_SIZEMAX:
g_value_set_int (value, bstest->sizemax);
break;
case ARG_ACCESSPATTERN:
g_value_set_string (value, bstest->accesspattern);
break;
case ARG_COUNT:
g_value_set_uint (value, bstest->count);
break;
case ARG_SILENT:
g_value_set_boolean (value, bstest->silent);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static GstStateChangeReturn
gst_bstest_change_state (GstElement * element, GstStateChange transition)
{
GstBsTest *bstest;
g_return_val_if_fail (GST_IS_BSTEST (element), GST_STATE_CHANGE_FAILURE);
bstest = GST_BSTEST (element);
if (GST_STATE_PENDING (element) == GST_STATE_NULL) {
if (bstest->bs) {
gst_bytestream_destroy (bstest->bs);
bstest->bs = NULL;
}
} else {
if (!bstest->bs) {
bstest->bs = gst_bytestream_new (bstest->sinkpad);
}
}
if (GST_ELEMENT_CLASS (parent_class)->change_state)
return GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
return GST_STATE_CHANGE_SUCCESS;
}
static gboolean
plugin_init (GstPlugin * plugin)
{
/* We need to create an ElementFactory for each element we provide.
* This consists of the name of the element, the GType identifier,
* and a pointer to the details structure at the top of the file.
*/
return gst_element_register (plugin, "bstest", GST_RANK_PRIMARY,
GST_TYPE_BSTEST);
}
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"bstest",
"test for the bytestream element",
plugin_init, VERSION, GST_LICENSE, GST_PACKAGE, GST_ORIGIN)

View file

@ -1,230 +0,0 @@
#include <string.h>
#include <stdlib.h>
#include <gst/gst.h>
#define VM_THRES 1000
#define MAX_CONFIG_LINE 255
#define MAX_CONFIG_PATTERN 64
typedef struct
{
gint src_data;
gint src_sizetype;
gchar *bs_accesspattern;
gboolean integrity_check;
}
TestParam;
static GSList *params = NULL;
static guint8 count;
static guint iterations;
static gboolean integrity_check = TRUE;
static gboolean verbose = FALSE;
static gboolean dump = FALSE;
static void
handoff (GstElement * element, GstBuffer * buf, GstPad * pad, gpointer data)
{
if (GST_IS_BUFFER (buf)) {
if (integrity_check) {
gint i;
guint8 *ptr = GST_BUFFER_DATA (buf);
for (i = 0; i < GST_BUFFER_SIZE (buf); i++) {
if (*ptr++ != count++) {
g_print ("data error!\n");
return;
}
}
}
} else {
g_print ("not a buffer ! %p\n", buf);
}
}
static gchar *
create_desc (TestParam * param)
{
gchar *desc;
desc =
g_strdup_printf ("%s %s, pattern %s",
(param->src_sizetype == 2 ? "fixed" : "random"),
(param->src_data == 1 ? "src" : "subbuffer"), param->bs_accesspattern);
return desc;
}
static gboolean
read_param_file (gchar * filename)
{
FILE *fp;
gchar line[MAX_CONFIG_LINE + 1];
guint linenr = 0;
gchar pattern[MAX_CONFIG_PATTERN];
gint data, sizetype, integrity_check;
gchar *scan_str;
gboolean res = TRUE;
fp = fopen (filename, "rb");
if (fp == NULL)
return FALSE;
scan_str = g_strdup_printf ("%%d %%d %%%ds %%d", MAX_CONFIG_PATTERN - 1);
while (fgets (line, MAX_CONFIG_LINE, fp)) {
linenr++;
if (line[0] == '\n' || line[0] == '#')
continue;
if (sscanf (line, scan_str, &data, &sizetype, pattern,
&integrity_check) != 4) {
g_print ("error on line: %d\n", linenr);
res = FALSE;
break;
} else {
TestParam *param = g_malloc (sizeof (TestParam));
param->src_data = data;
param->src_sizetype = sizetype;
param->bs_accesspattern = g_strdup (pattern);
param->integrity_check = (integrity_check == 0 ? FALSE : TRUE);
params = g_slist_append (params, param);
}
}
g_free (scan_str);
return res;
}
static void
run_test (GstBin * pipeline, gint iters)
{
gint vm = 0;
gint maxiters = iters;
gint prev_percent = -1;
count = 0;
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
while (iters) {
gint newvm = gst_alloc_trace_live_all ();
gint percent;
percent = (gint) ((maxiters - iters + 1) * 100.0 / maxiters);
if (percent != prev_percent || newvm - vm > VM_THRES) {
g_print ("\r%d (delta %d) %.3d%% ", newvm, newvm - vm,
percent);
prev_percent = percent;
vm = newvm;
}
gst_bin_iterate (pipeline);
if (iters > 0)
iters--;
}
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
}
static void
usage (char *argv[])
{
g_print ("usage: %s [--verbose] [--dump] <paramfile> <iterations>\n",
argv[0]);
}
int
main (int argc, char *argv[])
{
GstElement *src;
GstElement *sink;
GstElement *bs;
GstElement *pipeline;
gint testnum = 0;
GSList *walk;
gint arg_walk;
gst_alloc_trace_set_flags_all (GST_ALLOC_TRACE_LIVE);
gst_init (&argc, &argv);
arg_walk = 1;
while ((arg_walk < argc) && (argv[arg_walk][0] == '-')) {
if (!strncmp (argv[arg_walk], "--verbose", 9))
verbose = TRUE;
else if (!strncmp (argv[arg_walk], "--dump", 6))
dump = TRUE;
else {
g_print ("unknown option %s (ignored)\n", argv[arg_walk]);
}
arg_walk++;
}
if (argc - arg_walk < 2) {
usage (argv);
return -1;
}
if (!read_param_file (argv[arg_walk])) {
g_print ("error reading file %s\n", argv[arg_walk]);
usage (argv);
return -1;
}
arg_walk++;
iterations = atoi (argv[arg_walk]);
pipeline = gst_element_factory_make ("pipeline", "pipeline");
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", "src");
g_assert (src);
sink = gst_element_factory_make ("fakesink", "sink");
g_assert (sink);
g_object_set (sink, "signal-handoff", TRUE, NULL);
g_signal_connect (G_OBJECT (sink), "handoff", G_CALLBACK (handoff), NULL);
bs = gst_element_factory_make ("bstest", "bs");
g_assert (bs);
gst_element_link_many (src, bs, sink, NULL);
gst_bin_add_many (GST_BIN (pipeline), src, bs, sink, NULL);
walk = params;
while (walk) {
gchar *desc;
TestParam *param = (TestParam *) (walk->data);
integrity_check = param->integrity_check;
g_print ("\n\nrunning test %d (%d iterations):\n", testnum + 1, iterations);
desc = create_desc (param);
g_print ("%s\n", desc);
g_free (desc);
g_object_set (G_OBJECT (src), "data", param->src_data,
"sizetype", param->src_sizetype,
"filltype", (integrity_check ? 5 : 0), "silent", !verbose, NULL);
g_object_set (G_OBJECT (bs), "accesspattern", param->bs_accesspattern,
"silent", !verbose, NULL);
g_object_set (G_OBJECT (sink), "dump", dump, "silent", !verbose, NULL);
run_test (GST_BIN (pipeline), iterations);
testnum++;
walk = g_slist_next (walk);
}
g_print ("\n\ndone\n");
return 0;
}

View file

@ -1,93 +0,0 @@
# lots of parameters here. values for the columns are like:
#
# - data property in fakesrc: 1 = allocate, 2 = subbuffer
# - sizetype property in fakesrc: 2 = fixed, 3 = random
#
# - accesspattern for bstest
# <action><size>[:<action><size>...]
#
# <action> can be:
# r = read
# p = peek
# pb = peek bytes
# f = flush
# <size> can be:
# <empty> = fixed size
# r = random size
# < = previous size
# <int> = this size
#
# - integrity check: 0 = no, 1 = yes
#
1 2 r 1
1 2 rr 1
1 3 r 1
1 3 rr 1
2 2 r 1
2 2 rr 1
2 3 r 1
2 3 rr 1
1 2 p:r< 1
1 2 pr:r< 1
1 3 p:r< 1
1 3 pr:r< 1
2 2 p:r< 1
2 2 pr:r< 1
2 3 p:r< 1
2 3 pr:r< 1
1 2 p:rr 1
1 2 pr:rr 1
1 3 p:rr 1
1 3 pr:rr 1
2 2 p:rr 1
2 2 pr:rr 1
2 3 p:rr 1
2 3 pr:rr 1
1 2 pb:r 1
1 2 pbr:r 1
1 3 pb:r 1
1 3 pbr:r 1
2 2 pb:r 1
2 2 pbr:r 1
2 3 pb:r 1
2 3 pbr:r 1
1 2 pb:rr 1
1 2 pbr:rr 1
1 3 pb:rr 1
1 3 pbr:rr 1
2 2 pb:rr 1
2 2 pbr:rr 1
2 3 pb:rr 1
2 3 pbr:rr 1
1 2 p:fr:rr 0
1 2 pr:fr:rr 0
1 3 p:fr:rr 0
1 3 pr:fr:rr 0
2 2 p:fr:rr 0
2 2 pr:fr:rr 0
2 3 p:fr:rr 0
2 3 pr:fr:rr 0
1 2 fr:rr 0
1 2 fr:rr 0
1 3 fr:rr 0
1 3 fr:rr 0
2 2 fr:rr 0
2 2 fr:rr 0
2 3 fr:rr 0
2 3 fr:rr 0
1 2 fr:fr:rr 0
1 2 fr:fr:rr 0
1 3 fr:fr:rr 0
1 3 fr:fr:rr 0
2 2 fr:fr:rr 0
2 2 fr:fr:rr 0
2 3 fr:fr:rr 0
2 3 fr:fr:rr 0
1 2 pbr:pbr:rr 1
1 2 pbr:pbr:rr 1
1 3 pbr:pbr:rr 1
1 3 pbr:pbr:rr 1
2 2 pbr:pbr:rr 1
2 2 pbr:pbr:rr 1
2 3 pbr:pbr:rr 1
2 3 pbr:pbr:rr 1

View file

@ -36,7 +36,7 @@ GST_CAPS_FACTORY (rawcaps4,
"fourcc", GST_PROPS_LIST (
GST_PROPS_FOURCC (GST_STR_FOURCC ("YUY2")),
GST_PROPS_FOURCC (GST_STR_FOURCC ("YV12")),
GST_PROPS_FOURCC (GST_STR_FOURCC ("YUYV"))
GST_PROPS_FOURCC (GST_STR_FOURCC ("YUYV"))
),
"height", GST_PROPS_INT_RANGE (16, 4096)
)

View file

@ -31,13 +31,13 @@ gint
main (gint argc, gchar * argv[])
{
/* this file contains random tests for stuff that went wrong in some version
* and should be tested so we're sure it works right now
* and should be tested so we're sure it works right now
* Please add what exactly the code tests for in your test */
gst_init (&argc, &argv);
/* TEST 1:
* gstcaps.c 1.120 used a code path that caused a GST_ERROR for the tested
* gstcaps.c 1.120 used a code path that caused a GST_ERROR for the tested
* caps when simplifying even though that is absolutely valid */
{
GstCaps *caps =
@ -50,7 +50,7 @@ main (gint argc, gchar * argv[])
}
/* TEST 2:
* gstvalue.c 1.34 had a broken comparison function for int ranges that
* gstvalue.c 1.34 had a broken comparison function for int ranges that
* returned GST_VALUE_EQUAL even though the range end was different */
{
GValue v1 = { 0, };

View file

@ -1,10 +0,0 @@
test-registry.xml
*.bb
*.bbg
*.da
cleanup1
cleanup2
cleanup3
cleanup4
cleanup5

View file

@ -1,7 +0,0 @@
include ../Rules
tests_pass = cleanup1 cleanup2 cleanup4 cleanup5
tests_fail =
# cleanup3 fails depending on the machine
tests_ignore = cleanup3

View file

@ -1,60 +0,0 @@
#include <gst/gst.h>
static GstElement *
create_pipeline (void)
{
GstElement *fakesrc, *fakesink;
GstElement *pipeline;
pipeline = gst_pipeline_new ("main_pipeline");
fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
fakesink = gst_element_factory_make ("fakesink", "fakesink");
gst_bin_add_many (GST_BIN (pipeline), fakesrc, fakesink, NULL);
gst_element_link (fakesrc, fakesink);
g_object_set (G_OBJECT (fakesrc), "num_buffers", 5, NULL);
return pipeline;
}
gint
main (gint argc, gchar * argv[])
{
GstElement *pipeline;
gint i = 1000;
gint step = 100;
free (malloc (8)); /* -lefence */
gst_init (&argc, &argv);
g_mem_chunk_info ();
while (i--) {
if (i % step == 0)
fprintf (stderr, "%10d\r", i);
pipeline = create_pipeline ();
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
}
fprintf (stderr, "\n");
g_mem_chunk_info ();
return 0;
}

View file

@ -1,64 +0,0 @@
#include <gst/gst.h>
static GstElement *
create_pipeline (void)
{
GstElement *fakesrc, *fakesink;
GstElement *pipeline;
GstElement *bin;
pipeline = gst_pipeline_new ("main_pipeline");
fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
bin = gst_bin_new ("bin");
fakesink = gst_element_factory_make ("fakesink", "fakesink");
gst_bin_add (GST_BIN (bin), fakesink);
gst_element_add_ghost_pad (bin, gst_element_get_pad (fakesink, "sink"),
"sink");
gst_bin_add_many (GST_BIN (pipeline), fakesrc, bin, NULL);
gst_element_link (fakesrc, bin);
g_object_set (G_OBJECT (fakesrc), "num_buffers", 5, NULL);
return pipeline;
}
gint
main (gint argc, gchar * argv[])
{
GstElement *pipeline;
gint i = 1000;
gint step = 100;
free (malloc (8)); /* -lefence */
gst_init (&argc, &argv);
g_mem_chunk_info ();
while (i--) {
if (i % step == 0)
fprintf (stderr, "%10d\r", i);
pipeline = create_pipeline ();
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
}
fprintf (stderr, "\n");
g_mem_chunk_info ();
return 0;
}

View file

@ -1,68 +0,0 @@
#include <gst/gst.h>
static GstElement *
create_pipeline (void)
{
GstElement *fakesrc, *fakesink;
GstElement *pipeline;
GstElement *thread, *queue;
pipeline = gst_pipeline_new ("main_pipeline");
fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
thread = gst_thread_new ("thread");
fakesink = gst_element_factory_make ("fakesink", "fakesink");
queue = gst_element_factory_make ("queue", "queue");
gst_bin_add (GST_BIN (thread), fakesink);
gst_bin_add (GST_BIN (thread), queue);
gst_element_link (queue, fakesink);
gst_element_add_ghost_pad (thread, gst_element_get_pad (queue, "sink"),
"sink");
gst_element_link (fakesrc, thread);
gst_bin_add (GST_BIN (pipeline), fakesrc);
gst_bin_add (GST_BIN (pipeline), thread);
g_object_set (G_OBJECT (fakesrc), "num_buffers", 5, NULL);
return pipeline;
}
gint
main (gint argc, gchar * argv[])
{
GstElement *pipeline;
gint i = 10000;
gint step = 100;
free (malloc (8)); /* -lefence */
gst_init (&argc, &argv);
g_mem_chunk_info ();
while (i--) {
if (i % step == 0)
fprintf (stderr, "%10d\r", i);
pipeline = create_pipeline ();
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
}
fprintf (stderr, "\n");
g_mem_chunk_info ();
return 0;
}

View file

@ -1,52 +0,0 @@
#include <gst/gst.h>
gint
main (gint argc, gchar * argv[])
{
GstElement *pipeline;
GstElement *fakesrc;
gint i;
free (malloc (8)); /* -lefence */
gst_init (&argc, &argv);
i = 1000;
pipeline = gst_pipeline_new ("main_pipeline");
fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
g_object_set (G_OBJECT (fakesrc), "num_buffers", 5, NULL);
gst_bin_add (GST_BIN (pipeline), fakesrc);
g_mem_chunk_info ();
while (i--) {
GstElement *bin;
GstElement *fakesink;
g_print ("+");
bin = gst_bin_new ("bin");
fakesink = gst_element_factory_make ("fakesink", "fakesink");
gst_bin_add (GST_BIN (bin), fakesink);
gst_bin_add (GST_BIN (pipeline), bin);
gst_element_link (fakesrc, fakesink);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
gst_element_set_state (pipeline, GST_STATE_NULL);
g_print ("-");
gst_bin_remove (GST_BIN (pipeline), GST_ELEMENT (bin));
}
g_print ("\n");
g_mem_chunk_info ();
return 0;
}

View file

@ -1,41 +0,0 @@
#include <gst/gst.h>
int
main (int argc, char *argv[])
{
GstElement *bin, *element;
gint i = 1000;
gint step = 100;
free (malloc (8)); /* -lefence */
gst_init (&argc, &argv);
g_mem_chunk_info ();
bin = gst_pipeline_new ("pipeline");
while (i--) {
GstPad *pad;
if (i % step == 0)
fprintf (stderr, "\r%10d", i);
element = gst_element_factory_make ("tee", "tee");
if (!element)
break;
pad = gst_element_get_request_pad (element, "src%d");
gst_bin_add (GST_BIN (bin), element);
gst_bin_remove (GST_BIN (bin), element);
}
fprintf (stderr, "+\n");
gst_object_unref (bin);
g_mem_chunk_info ();
return 0;
}

View file

@ -1,6 +1,6 @@
/*
* interpolator.c
*
*
* test interpolator methods
*
*/

View file

@ -38,7 +38,7 @@ main (gint argc, gchar * argv[])
GST_ERROR ("This should print null: %" GST_PTR_FORMAT, NULL);
GST_ERROR ("This should print a pointer: %" GST_PTR_FORMAT, &null);
/* 64 bit address to a 32 bit int will cause the GObject interpretation
* to segfault; since GST_PTR_FORMAT only works on stuff with
* to segfault; since GST_PTR_FORMAT only works on stuff with
* sizeof(gpointer) */
/* GST_ERROR ("This should print a pointer: %" GST_PTR_FORMAT, &zero); */

View file

@ -5,7 +5,7 @@
* which shows a bug in 0.3.2 :
* request pad, get 0
* request pad, get 1
* remove pad 0,
* remove pad 0,
* request pad, get 1 (number of pads), already exists, assert fail
*
* thomas@apestaart.org

View file

@ -1,2 +0,0 @@
pad_link

View file

@ -1,5 +0,0 @@
include ../Rules
tests_pass = pad_link
tests_fail =
tests_ignore =

View file

@ -1,35 +0,0 @@
#include <gst/gst.h>
/* this test checks that gst_pad_link takes into account all available
* information when trying to link two pads.
* Because identity proxies caps, the caps in the first and second link
* must be compatible for this pipeline to work.
* Since they are not, the second linkig attempt should fail.
*/
gint
main (int argc, gchar ** argv)
{
GstElement *src, *identity, *sink;
GstCaps *one, *two;
gst_init (&argc, &argv);
/* create incompatible caps */
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
identity = gst_element_factory_make ("identity", NULL);
g_assert (identity);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
one = gst_caps_from_string ("some/mime");
two = gst_caps_from_string ("other/mime");
g_assert (GST_PAD_LINK_SUCCESSFUL (gst_pad_link_filtered (gst_element_get_pad
(src, "src"), gst_element_get_pad (identity, "sink"), one)));
g_assert (!GST_PAD_LINK_SUCCESSFUL (gst_pad_link_filtered (gst_element_get_pad
(identity, "src"), gst_element_get_pad (sink, "sink"), two)));
return 0;
}

View file

@ -1,5 +0,0 @@
include ../Rules
tests_pass = link
tests_fail = chainnopull getnopush
tests_ignore =

View file

@ -1,66 +0,0 @@
/*
* this tests that chain-based pads don't pull.
*/
#include <gst/gst.h>
typedef struct _GstTestSink
{
GstElement parent;
GstPad *sinkpad;
} GstTestSink;
typedef GstElementClass GstTestSinkClass;
static void
gst_test_sink_class_init (GstTestSinkClass * klass)
{
}
static void
gst_test_sink_base_init (gpointer klass)
{
}
static void
gst_test_sink_chain (GstPad * pad, GstData * data)
{
data = gst_pad_pull (pad);
}
static void
gst_test_sink_init (GstTestSink * sink)
{
sink->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
gst_pad_set_chain_function (sink->sinkpad, gst_test_sink_chain);
gst_element_add_pad (GST_ELEMENT (sink), sink->sinkpad);
}
GST_BOILERPLATE (GstTestSink, gst_test_sink, GstElement, GST_TYPE_ELEMENT);
int
main (int argc, char *argv[])
{
GstElement *pipeline, *fakesrc, *testsink;
gint n;
gst_init (&argc, &argv);
pipeline = gst_pipeline_new ("p");
fakesrc = gst_element_factory_make ("fakesrc", "src");
testsink = g_object_new (gst_test_sink_get_type (), NULL);
gst_object_set_name (GST_OBJECT (testsink), "sink");
gst_bin_add_many (GST_BIN (pipeline), fakesrc, testsink, NULL);
gst_element_link (fakesrc, testsink);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
for (n = 0; n < 100; n++) {
if (!gst_bin_iterate (GST_BIN (pipeline)))
break;
}
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
return 0;
}

View file

@ -1,71 +0,0 @@
/*
* this tests that get-based pads don't push.
*/
#include <gst/gst.h>
typedef struct _GstTestSrc
{
GstElement parent;
GstPad *srcpad;
} GstTestSrc;
typedef GstElementClass GstTestSrcClass;
static void
gst_test_src_class_init (GstTestSrcClass * klass)
{
}
static void
gst_test_src_base_init (gpointer klass)
{
}
static GstData *
gst_test_src_get (GstPad * pad)
{
GstEvent *event;
event = gst_event_new (GST_EVENT_INTERRUPT);
gst_event_ref (event);
gst_pad_push (pad, GST_DATA (event));
return GST_DATA (event);
}
static void
gst_test_src_init (GstTestSrc * src)
{
src->srcpad = gst_pad_new ("src", GST_PAD_SRC);
gst_pad_set_get_function (src->srcpad, gst_test_src_get);
gst_element_add_pad (GST_ELEMENT (src), src->srcpad);
}
GST_BOILERPLATE (GstTestSrc, gst_test_src, GstElement, GST_TYPE_ELEMENT);
int
main (int argc, char *argv[])
{
GstElement *pipeline, *testsrc, *fakesink;
gint n;
gst_init (&argc, &argv);
pipeline = gst_pipeline_new ("p");
testsrc = g_object_new (gst_test_src_get_type (), NULL);
gst_object_set_name (GST_OBJECT (testsrc), "src");
fakesink = gst_element_factory_make ("fakesink", "sink");
gst_bin_add_many (GST_BIN (pipeline), testsrc, fakesink, NULL);
gst_element_link (testsrc, fakesink);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
for (n = 0; n < 100; n++) {
if (!gst_bin_iterate (GST_BIN (pipeline)))
break;
}
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
return 0;
}

View file

@ -1,194 +0,0 @@
/*
* Test that:
* - get-based sources can return data, loop-based sources can push.
* - chain-based filters receive/push, loop-based filters can pull/push.
* - chain-based sinks receive, loop-based sinks pull.
*/
#include <gst/gst.h>
/*
* Scary type code.
*/
typedef struct _GstTestElement
{
GstElement parent;
GstPad *srcpad, *sinkpad;
} GstTestSrc, GstTestFilter, GstTestSink, GstTestElement;
typedef GstElementClass GstTestSrcClass, GstTestFilterClass, GstTestSinkClass,
GstTestElementClass;
#define gst_test_src_class_init gst_test_element_class_init
#define gst_test_filter_class_init gst_test_element_class_init
#define gst_test_sink_class_init gst_test_element_class_init
#define gst_test_src_base_init gst_test_element_base_init
#define gst_test_filter_base_init gst_test_element_base_init
#define gst_test_sink_base_init gst_test_element_base_init
static void
gst_test_element_class_init (GstTestElementClass * klass)
{
}
static void
gst_test_element_base_init (gpointer klass)
{
}
/*
* Actual element code.
*/
gboolean loop = FALSE;
static GstData *
gst_test_src_get (GstPad * pad)
{
return GST_DATA (gst_event_new (GST_EVENT_INTERRUPT));
}
static void
gst_test_src_loop (GstElement * element)
{
GstTestSrc *src = (GstTestElement *) element;
gst_pad_push (src->srcpad, gst_test_src_get (src->srcpad));
}
static void
gst_test_src_init (GstTestElement * src)
{
src->srcpad = gst_pad_new ("src", GST_PAD_SRC);
if (loop) {
gst_element_set_loop_function (GST_ELEMENT (src), gst_test_src_loop);
} else {
gst_pad_set_get_function (src->srcpad, gst_test_src_get);
}
gst_element_add_pad (GST_ELEMENT (src), src->srcpad);
GST_OBJECT_FLAG_SET (src, GST_ELEMENT_EVENT_AWARE);
}
static void
gst_test_filter_chain (GstPad * pad, GstData * data)
{
GstTestFilter *filter = (GstTestElement *) gst_pad_get_parent (pad);
gst_pad_push (filter->srcpad, data);
}
static void
gst_test_filter_loop (GstElement * element)
{
GstTestFilter *filter = (GstTestElement *) element;
gst_test_filter_chain (filter->sinkpad, gst_pad_pull (filter->sinkpad));
}
static void
gst_test_filter_init (GstTestElement * filter)
{
filter->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
if (loop) {
gst_element_set_loop_function (GST_ELEMENT (filter), gst_test_filter_loop);
} else {
gst_pad_set_chain_function (filter->sinkpad, gst_test_filter_chain);
}
gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
filter->srcpad = gst_pad_new ("src", GST_PAD_SRC);
gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
GST_OBJECT_FLAG_SET (filter, GST_ELEMENT_EVENT_AWARE);
}
static void
gst_test_sink_chain (GstPad * pad, GstData * data)
{
gst_data_unref (data);
}
static void
gst_test_sink_loop (GstElement * element)
{
GstTestSink *sink = (GstTestElement *) element;
gst_test_sink_chain (sink->sinkpad, gst_pad_pull (sink->sinkpad));
}
static void
gst_test_sink_init (GstTestElement * sink)
{
sink->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
if (loop) {
gst_element_set_loop_function (GST_ELEMENT (sink), gst_test_sink_loop);
} else {
gst_pad_set_chain_function (sink->sinkpad, gst_test_sink_chain);
}
gst_element_add_pad (GST_ELEMENT (sink), sink->sinkpad);
GST_OBJECT_FLAG_SET (sink, GST_ELEMENT_EVENT_AWARE);
}
#define parent_class src_parent_class
GST_BOILERPLATE (GstTestSrc, gst_test_src, GstElement, GST_TYPE_ELEMENT);
#undef parent_class
#define parent_class filter_parent_class
GST_BOILERPLATE (GstTestFilter, gst_test_filter, GstElement, GST_TYPE_ELEMENT);
#undef parent_class
#define parent_class sink_parent_class
GST_BOILERPLATE (GstTestSink, gst_test_sink, GstElement, GST_TYPE_ELEMENT);
#undef parent_class
/*
* Actual test.
*/
static void
cb_error (GstElement * element)
{
g_assert_not_reached ();
}
int
main (int argc, char *argv[])
{
GstElement *pipeline, *src, *filter, *sink;
gint n, r;
gboolean res;
gst_init (&argc, &argv);
for (r = 0; r < 2; r++) {
pipeline = gst_pipeline_new ("p");
g_signal_connect (pipeline, "error", G_CALLBACK (cb_error), NULL);
src = g_object_new (gst_test_src_get_type (), NULL);
gst_object_set_name (GST_OBJECT (src), "src");
filter = g_object_new (gst_test_filter_get_type (), NULL);
gst_object_set_name (GST_OBJECT (filter), "filter");
sink = g_object_new (gst_test_sink_get_type (), NULL);
gst_object_set_name (GST_OBJECT (sink), "sink");
gst_bin_add_many (GST_BIN (pipeline), src, filter, sink, NULL);
res = gst_element_link (src, filter);
g_assert (res);
res = gst_element_link (filter, sink);
g_assert (res);
gst_element_set_state (pipeline, GST_STATE_PLAYING);
for (n = 0; n < 100; n++) {
if (!gst_bin_iterate (GST_BIN (pipeline)))
g_assert_not_reached ();
}
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
/* switch element types */
g_print ("Loop=%s done\n", loop ? "true" : "false");
loop = !loop;
}
return 0;
}

View file

@ -38,7 +38,7 @@ create_pipeline (void)
gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
gst_element_link (src, sink);
/**
/**
* now make the bug appear
* I believe it has something to do with 2 chains being created in the scheduler
* but I haven't looked at it yet

View file

@ -1,7 +0,0 @@
include ../Rules
tests_pass = gst-print-formats
tests_fail =
tests_ignore =

View file

@ -1,347 +0,0 @@
/* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
* 2004 Thomas Vander Stichele <thomas@apestaart.org>
*
* gst-inspect.c: tool to inspect the GStreamer registry
*
* 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., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <gst/gst.h>
#include "gst/gst-i18n-app.h"
#include <string.h>
#include <locale.h>
#include <glib/gprintf.h>
#define static
static void
print_pad_templates_info (GstElement * element, GstElementFactory * factory,
GstPadDirection dir)
{
GstElementClass *gstelement_class;
const GList *pads;
GstPadTemplate *padtemplate;
if (!factory->numpadtemplates) {
return;
}
gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element));
pads = factory->padtemplates;
while (pads) {
padtemplate = (GstPadTemplate *) (pads->data);
pads = g_list_next (pads);
if (padtemplate->direction == dir) {
if (padtemplate->caps) {
GstStructure *structure;
int i;
for (i = 0; i < gst_caps_get_size (padtemplate->caps); i++) {
structure = gst_caps_get_structure (padtemplate->caps, i);
g_print (" %s\n", gst_structure_get_name (structure));
}
}
}
}
}
static void
print_element_list (const char *klass, GstPadDirection dir)
{
GList *plugins;
g_print ("Elements in %s:\n", klass);
for (plugins = gst_registry_pool_plugin_list (); plugins;
plugins = g_list_next (plugins)) {
GList *features;
GstPlugin *plugin;
plugin = (GstPlugin *) (plugins->data);
features = gst_plugin_get_feature_list (plugin);
while (features) {
GstPluginFeature *feature;
feature = GST_PLUGIN_FEATURE (features->data);
if (GST_IS_ELEMENT_FACTORY (feature)) {
GstElementFactory *factory;
GstElement *element;
factory = GST_ELEMENT_FACTORY (feature);
if (strncmp (factory->details.klass, klass, strlen (klass)) == 0) {
g_print (" %s: %s (%d)\n", GST_PLUGIN_FEATURE_NAME (factory),
factory->details.longname, gst_plugin_feature_get_rank (feature));
element = gst_element_factory_create (factory, NULL);
print_pad_templates_info (element, factory, dir);
gst_object_unref (element);
}
}
features = g_list_next (features);
}
}
g_print ("\n");
}
static void
print_typefind_list (void)
{
GList *plugins;
g_print ("Typefind list:\n");
for (plugins = gst_registry_pool_plugin_list (); plugins;
plugins = g_list_next (plugins)) {
GList *features;
GstPlugin *plugin;
plugin = (GstPlugin *) (plugins->data);
features = gst_plugin_get_feature_list (plugin);
while (features) {
GstPluginFeature *feature;
feature = GST_PLUGIN_FEATURE (features->data);
if (GST_IS_TYPE_FIND_FACTORY (feature)) {
GstTypeFindFactory *factory;
char *s;
gst_plugin_load_file (plugin->filename, NULL);
factory = GST_TYPE_FIND_FACTORY (feature);
g_print (" %s: (%d)\n", GST_PLUGIN_FEATURE_NAME (factory),
gst_plugin_feature_get_rank (feature));
s = gst_caps_to_string (gst_type_find_factory_get_caps (factory));
g_print (" %s\n", s);
g_free (s);
}
features = g_list_next (features);
}
}
g_print ("\n");
}
static int
list_sort_func (gconstpointer a, gconstpointer b)
{
return strcmp ((const char *) a, (const char *) b);
}
static GList *
get_typefind_mime_list (void)
{
GList *plugins;
GList *mime_list = NULL;
for (plugins = gst_registry_pool_plugin_list (); plugins;
plugins = g_list_next (plugins)) {
GList *features;
GstPlugin *plugin;
plugin = (GstPlugin *) (plugins->data);
features = gst_plugin_get_feature_list (plugin);
while (features) {
GstPluginFeature *feature;
feature = GST_PLUGIN_FEATURE (features->data);
if (GST_IS_TYPE_FIND_FACTORY (feature)) {
GstTypeFindFactory *factory;
char *s;
int i;
const GstCaps *caps;
factory = GST_TYPE_FIND_FACTORY (feature);
caps = gst_type_find_factory_get_caps (factory);
if (gst_plugin_feature_get_rank (feature) > 0 && caps != NULL) {
for (i = 0; i < gst_caps_get_size (caps); i++) {
const GstStructure *structure = gst_caps_get_structure (caps, i);
s = g_strdup (gst_structure_get_name (structure));
mime_list = g_list_prepend (mime_list, s);
}
}
}
features = g_list_next (features);
}
}
return mime_list;
}
GList *
g_list_uniqify (GList * list)
{
GList *item;
for (item = g_list_first (list); item; item = g_list_next (item)) {
GList *next_item = g_list_next (item);
while (next_item && strcmp (item->data, next_item->data) == 0) {
g_free (next_item->data);
list = g_list_delete_link (list, next_item);
next_item = g_list_next (item);
}
}
return list;
}
static GList *
get_pad_templates_info (GstElement * element, GstElementFactory * factory,
GstPadDirection dir)
{
GstElementClass *gstelement_class;
const GList *pads;
GstPadTemplate *padtemplate;
GList *mime_list = NULL;
if (!factory->numpadtemplates) {
return NULL;
}
gstelement_class = GST_ELEMENT_CLASS (G_OBJECT_GET_CLASS (element));
pads = factory->padtemplates;
while (pads) {
padtemplate = (GstPadTemplate *) (pads->data);
pads = g_list_next (pads);
if (padtemplate->direction == dir) {
if (padtemplate->caps) {
GstStructure *structure;
int i;
for (i = 0; i < gst_caps_get_size (padtemplate->caps); i++) {
structure = gst_caps_get_structure (padtemplate->caps, i);
mime_list = g_list_prepend (mime_list,
g_strdup (gst_structure_get_name (structure)));
}
}
}
}
return mime_list;
}
static GList *
get_element_mime_list (const char *klass, GstPadDirection dir)
{
GList *mime_list = NULL;
GList *plugins;
for (plugins = gst_registry_pool_plugin_list (); plugins;
plugins = g_list_next (plugins)) {
GList *features;
GstPlugin *plugin;
plugin = (GstPlugin *) (plugins->data);
features = gst_plugin_get_feature_list (plugin);
while (features) {
GstPluginFeature *feature;
feature = GST_PLUGIN_FEATURE (features->data);
if (GST_IS_ELEMENT_FACTORY (feature)) {
GstElementFactory *factory;
GstElement *element;
factory = GST_ELEMENT_FACTORY (feature);
if (strncmp (factory->details.klass, klass, strlen (klass)) == 0) {
if (gst_plugin_feature_get_rank (feature) > 0) {
GList *list;
element = gst_element_factory_create (factory, NULL);
list = get_pad_templates_info (element, factory, dir);
mime_list = g_list_concat (mime_list, list);
gst_object_unref (element);
}
}
}
features = g_list_next (features);
}
}
return mime_list;
}
static void
print_mime_list (void)
{
GList *list;
GList *typefind_list;
GList *item;
GList *item2;
typefind_list = get_typefind_mime_list ();
typefind_list = g_list_sort (typefind_list, list_sort_func);
typefind_list = g_list_uniqify (typefind_list);
list = get_element_mime_list ("Codec/Demuxer", GST_PAD_SINK);
list = g_list_concat (list, get_element_mime_list ("Codec/Decoder",
GST_PAD_SINK));
list = g_list_sort (list, list_sort_func);
list = g_list_uniqify (list);
g_print ("MIME media type list:\n");
for (item = g_list_first (list); item; item = g_list_next (item)) {
for (item2 = g_list_first (typefind_list); item2;
item2 = g_list_next (item2)) {
if (strcmp ((char *) item->data, (char *) item2->data) == 0) {
g_print (" %s\n", (char *) item->data);
}
}
}
}
int
main (int argc, char *argv[])
{
#ifdef GETTEXT_PACKAGE
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
#endif
gst_init (&argc, &argv);
print_element_list ("Codec/Demuxer", GST_PAD_SINK);
print_element_list ("Codec/Decoder", GST_PAD_SINK);
print_element_list ("Codec/Muxer", GST_PAD_SRC);
print_element_list ("Codec/Encoder", GST_PAD_SRC);
print_typefind_list ();
print_mime_list ();
return 0;
}

View file

@ -1,17 +0,0 @@
group_link
relink_sink
relink_src
unlink_sink
unlink_src
unref_sink
unref_src
useless_iteration
143777
143777-2
142183
142183-2
147713
147819
147894
147894-2
queue_link

View file

@ -1,73 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gst/gst.h>
static void
handoff_identity (GstElement * element)
{
GstBin *parent;
parent = GST_BIN (gst_element_get_parent (element));
g_print ("identity handoff\n");
/* element is unreffed and destroyed here, which will cause
* an assert */
gst_bin_remove (parent, element);
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *id;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
id = gst_element_factory_make ("identity", NULL);
g_assert (id);
g_signal_connect (G_OBJECT (id), "handoff", (GCallback) handoff_identity,
NULL);
g_object_set (G_OBJECT (id), "loop-based", TRUE, NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, id, sink, NULL);
gst_element_link_pads (src, "src", id, "sink");
gst_element_link_pads (id, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
g_print ("got past iteration, scheduler refs elements correctly\n");
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
src = id = sink = pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,95 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <unistd.h>
#include <gst/gst.h>
static void
handoff_identity (GstElement * element)
{
GstBin *parent;
parent = GST_BIN (gst_element_get_parent (element));
g_print ("identity handoff\n");
gst_bin_remove (parent, element);
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *id;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
id = gst_element_factory_make ("identity", NULL);
g_assert (id);
/* ref object here as it will be unparented and destroyed in the
* handoff signal, normally the scheduler should keep a ref to the
* currently scheduled elements but that's another bug displayed in
* 142183-2.c */
gst_object_ref (id);
g_signal_connect (G_OBJECT (id), "handoff", (GCallback) handoff_identity,
NULL);
g_object_set (G_OBJECT (id), "loop-based", TRUE, NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, id, sink, NULL);
/* this is what triggers the bug */
gst_element_enable_threadsafe_properties (GST_ELEMENT (src));
gst_element_enable_threadsafe_properties (GST_ELEMENT (id));
gst_element_enable_threadsafe_properties (GST_ELEMENT (sink));
gst_element_link_pads (src, "src", id, "sink");
gst_element_link_pads (id, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
/* 'cause we're going into deadlock mode */
alarm (5);
g_print ("adding identity back...\n");
/* add identity back in */
gst_bin_add_many (GST_BIN (pipeline), id, NULL);
g_print ("going into possible deadlock... alarm at 5 seconds\n");
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
g_print ("ok, no deadlock. bug 142183 fixed!\n");
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
gst_object_unref (id);
src = id = sink = pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,64 +0,0 @@
#include <gst/gst.h>
int
main (int argc, char **argv)
{
GstElement *src, *sink, *enc, *tee;
GstElement *pipeline;
int i;
gst_init (&argc, &argv);
pipeline = gst_element_factory_make ("pipeline", "pipeline");
src = gst_element_factory_make ("fakesrc", "src");
g_assert (src);
tee = gst_element_factory_make ("tee", "tee1");
g_assert (tee);
enc = gst_element_factory_make ("identity", "enc");
g_assert (enc);
sink = gst_element_factory_make ("fakesink", "sink");
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, tee, enc, sink, NULL);
if (!gst_element_link_many (src, tee, enc, sink, NULL))
g_assert_not_reached ();
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
for (i = 0; i < 5; i++) {
if (!gst_bin_iterate (GST_BIN (pipeline)))
g_assert_not_reached ();
g_print ("%d\n", i);
}
if (gst_element_set_state (pipeline,
GST_STATE_PAUSED) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
gst_element_unlink_many (tee, enc, sink, NULL);
gst_bin_remove_many (GST_BIN (pipeline), enc, sink, NULL);
enc = gst_element_factory_make ("identity", "enc");
g_assert (enc);
sink = gst_element_factory_make ("fakesink", "sink");
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), enc, sink, NULL);
if (!gst_element_link_many (tee, enc, sink, NULL))
g_assert_not_reached ();
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
for (i = 5; i < 10; i++) {
if (!gst_bin_iterate (GST_BIN (pipeline)))
g_assert_not_reached ();
g_print ("%d\n", i);
}
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
g_print ("done.\n");
return 0;
}

View file

@ -1,73 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Benjamin Otte <otte@gnome.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
* This file reproduces the bug in the bugreport #143777, as can be seen at
* http://bugzilla.gnome.org/show_bug.cgi?id=143777 - the issue is that when
* pausing a pipeline while the chainhandler is still running, then unlinking
* the pad that's chain function is called and relinking it clears the buffer
* that was stored for sending the event. gst_pad_call_chain_function needs
* to check that.
* The fix is in gstpad.c, revision 1.327
*/
#include <gst/gst.h>
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *id;
guint i = 0, j;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
id = gst_element_factory_make ("identity", NULL);
g_assert (id);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, id, sink, NULL);
while (i < 100) {
g_print ("running... (%d iterations)\n", i);
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
gst_element_link_many (src, id, sink, NULL);
for (j = 0; j < i; j++)
gst_bin_iterate (GST_BIN (pipeline));
if (gst_element_set_state (pipeline,
GST_STATE_PAUSED) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
gst_element_unlink_many (src, id, sink, NULL);
i++;
}
g_print ("cleaning up...\n");
g_assert (i == 100);
gst_object_unref (pipeline);
src = id = sink = pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,92 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymanse <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gst/gst.h>
static gint src_handoff = 0;
static void
handoff_src (GstElement * element)
{
g_print ("src handoff\n");
src_handoff++;
}
static void
handoff_sink (GstElement * element)
{
g_print ("sink handoff\n");
g_assert (src_handoff == 1);
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *id1, *id2;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
g_object_set (G_OBJECT (src), "signal-handoffs", TRUE, NULL);
g_signal_connect (G_OBJECT (src), "handoff", (GCallback) handoff_src, NULL);
id1 = gst_element_factory_make ("identity", NULL);
g_assert (id1);
id2 = gst_element_factory_make ("identity", NULL);
g_assert (id2);
g_object_set (G_OBJECT (id2), "loop-based", TRUE, NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
g_object_set (G_OBJECT (sink), "signal-handoffs", TRUE, NULL);
g_signal_connect (G_OBJECT (sink), "handoff", (GCallback) handoff_sink, NULL);
gst_bin_add_many (GST_BIN (pipeline), src, id1, NULL);
gst_element_link_pads (src, "src", id1, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
if (gst_element_set_state (id2,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
if (gst_element_set_state (sink,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
gst_bin_add_many (GST_BIN (pipeline), sink, NULL);
gst_element_link_pads (id2, "src", sink, "sink");
gst_element_link_pads (id1, "src", id2, "sink");
gst_bin_add_many (GST_BIN (pipeline), id2, NULL);
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
src = id1 = id2 = sink = pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,101 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <unistd.h>
#include <gst/gst.h>
static gboolean handoff;
static void
handoff_identity1 (GstElement * element)
{
g_print ("identity1 handoff\n");
handoff = TRUE;
}
static void
handoff_identity2 (GstElement * element)
{
g_print ("identity2 handoff\n");
handoff = TRUE;
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *id1, *id2;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
id1 = gst_element_factory_make ("identity", NULL);
g_assert (id1);
g_object_set (G_OBJECT (id1), "loop-based", TRUE, NULL);
g_object_set (G_OBJECT (id1), "duplicate", 3, NULL);
g_signal_connect (G_OBJECT (id1), "handoff", (GCallback) handoff_identity1,
NULL);
id2 = gst_element_factory_make ("identity", NULL);
g_assert (id2);
g_object_set (G_OBJECT (id2), "loop-based", TRUE, NULL);
g_signal_connect (G_OBJECT (id2), "handoff", (GCallback) handoff_identity2,
NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, id1, id2, sink, NULL);
gst_element_link_pads (src, "src", id1, "sink");
gst_element_link_pads (id1, "src", id2, "sink");
gst_element_link_pads (id2, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("running...\n");
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
/* do ugly stuff here */
gst_object_ref (id1);
gst_bin_remove (GST_BIN (pipeline), id1);
gst_element_link_pads (src, "src", id1, "sink");
gst_element_link_pads (id1, "src", id2, "sink");
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
gst_bin_iterate (GST_BIN (pipeline));
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
src = id1 = id2 = sink = pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,138 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <unistd.h>
#include <gst/gst.h>
static gboolean empty;
static gboolean bug;
static gboolean handoff;
static GstElement *pipeline2;
static void
queue_empty (GstElement * element)
{
g_print ("queue empty\n");
if (!handoff)
bug = TRUE;
}
static void
queue_filled (GstElement * element)
{
g_print ("queue filled\n");
empty = FALSE;
/* read from the other end */
handoff = FALSE;
bug = FALSE;
alarm (5);
g_print ("emptying queue with 5 second timeout...\n");
while (!bug && !handoff) {
gst_bin_iterate (GST_BIN (pipeline2));
}
}
static void
handoff_identity (GstElement * element)
{
g_print ("identity handoff\n");
handoff = TRUE;
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *queue, *id;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
queue = gst_element_factory_make ("queue", NULL);
g_assert (queue);
g_signal_connect (G_OBJECT (queue), "overrun", (GCallback) queue_filled,
NULL);
g_signal_connect (G_OBJECT (queue), "underrun", (GCallback) queue_empty,
NULL);
gst_bin_add_many (GST_BIN (pipeline), src, queue, NULL);
gst_element_link_pads (src, "src", queue, "sink");
/* second pipeline for sinks */
pipeline2 = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline2);
id = gst_element_factory_make ("identity", NULL);
g_assert (id);
g_signal_connect (G_OBJECT (id), "handoff", (GCallback) handoff_identity,
NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline2), id, sink, NULL);
gst_element_link_pads (queue, "src", id, "sink");
gst_element_link_pads (id, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
if (gst_element_set_state (pipeline2,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("running...\n");
/* fill queue */
empty = TRUE;
while (empty) {
gst_bin_iterate (GST_BIN (pipeline));
}
g_assert (!bug);
g_print ("relinking...\n");
/* now unlink and link id and sink */
gst_element_unlink_pads (id, "src", sink, "sink");
gst_element_link_pads (id, "src", sink, "sink");
g_print ("running again...\n");
/* fill queue */
empty = TRUE;
while (empty) {
gst_bin_iterate (GST_BIN (pipeline));
}
g_assert (!bug);
/* trigger the bug */
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
gst_object_unref (pipeline2);
src = id = sink = pipeline = pipeline2 = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,146 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <unistd.h>
#include <gst/gst.h>
static gboolean empty;
static gboolean bug;
static gboolean handoff;
static GstElement *pipeline2;
static void
queue_empty (GstElement * element)
{
g_print ("queue empty\n");
if (!handoff)
bug = TRUE;
}
static void
queue_filled (GstElement * element)
{
g_print ("queue filled\n");
empty = FALSE;
/* read from the other end */
handoff = FALSE;
bug = FALSE;
alarm (5);
g_print ("emptying queue with 5 second timeout...\n");
while (!bug && !handoff) {
gst_bin_iterate (GST_BIN (pipeline2));
}
}
static void
handoff_identity (GstElement * element)
{
g_print ("identity handoff\n");
handoff = TRUE;
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink, *queue, *id;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
queue = gst_element_factory_make ("queue", NULL);
g_assert (queue);
g_signal_connect (G_OBJECT (queue), "overrun", (GCallback) queue_filled,
NULL);
g_signal_connect (G_OBJECT (queue), "underrun", (GCallback) queue_empty,
NULL);
gst_bin_add_many (GST_BIN (pipeline), src, queue, NULL);
gst_element_link_pads (src, "src", queue, "sink");
/* second pipeline for sinks */
pipeline2 = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline2);
id = gst_element_factory_make ("identity", NULL);
g_assert (id);
g_signal_connect (G_OBJECT (id), "handoff", (GCallback) handoff_identity,
NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline2), id, sink, NULL);
gst_element_link_pads (queue, "src", id, "sink");
gst_element_link_pads (id, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
if (gst_element_set_state (pipeline2,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("running...\n");
/* fill queue */
empty = TRUE;
while (empty) {
gst_bin_iterate (GST_BIN (pipeline));
}
g_assert (!bug);
if (gst_element_set_state (pipeline2,
GST_STATE_READY) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("relinking...\n");
/* now unlink and link id and sink */
gst_element_unlink_pads (id, "src", sink, "sink");
gst_element_link_pads (id, "src", sink, "sink");
if (gst_element_set_state (pipeline2,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("running again...\n");
/* fill queue */
empty = TRUE;
while (empty) {
gst_bin_iterate (GST_BIN (pipeline));
}
g_assert (!bug);
/* trigger the bug */
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
gst_object_unref (pipeline2);
src = id = sink = pipeline = pipeline2 = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,30 +0,0 @@
include ../Rules
tests_pass = \
unlink_src unlink_sink \
relink_src relink_sink \
unref_src unref_sink \
142183 142183-2 \
143777 143777-2 \
147713 \
147819 \
147894 147894-2 group_link \
queue_link
# don't enable this one unless it actually works.
# useless_iteration
tests_fail =
tests_ignore =
unlink_src_SOURCES = unlink.c
unlink_src_CFLAGS = $(AM_CFLAGS) -DELEMENT=src
unlink_sink_SOURCES = unlink.c
unlink_sink_CFLAGS = $(AM_CFLAGS) -DELEMENT=sink
relink_src_SOURCES = relink.c
relink_src_CFLAGS = $(AM_CFLAGS) -DELEMENT=src -DOTHER_ELEMENT=sink
relink_sink_SOURCES = relink.c
relink_sink_CFLAGS = $(AM_CFLAGS) -DELEMENT=sink -DOTHER_ELEMENT=src
unref_src_SOURCES = unref.c
unref_src_CFLAGS = $(AM_CFLAGS) -DELEMENT=src
unref_sink_SOURCES = unref.c
unref_sink_CFLAGS = $(AM_CFLAGS) -DELEMENT=sink

View file

@ -1,67 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <unistd.h>
#include <gst/gst.h>
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *id1, *id2, *sink;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
id1 = gst_element_factory_make ("identity", NULL);
g_assert (id1);
id2 = gst_element_factory_make ("identity", NULL);
g_assert (id2);
g_object_set (G_OBJECT (id2), "loop-based", TRUE, NULL);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, id1, id2, sink, NULL);
/* link is not accounted for here... */
gst_element_link_pads (id1, "src", id2, "sink");
gst_element_link_pads (src, "src", id1, "sink");
gst_element_link_pads (id2, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("running...\n");
/* fill queue */
gst_bin_iterate (GST_BIN (pipeline));
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
src = id1 = id2 = sink = pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,69 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Wim Taymans <wim@fluendo.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <unistd.h>
#include <gst/gst.h>
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *thread, *bin, *src, *queue, *id1, *sink;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
queue = gst_element_factory_make ("queue", NULL);
g_assert (queue);
thread = gst_element_factory_make ("thread", NULL);
g_assert (thread);
bin = gst_element_factory_make ("bin", NULL);
g_assert (bin);
id1 = gst_element_factory_make ("identity", NULL);
g_assert (id1);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (bin), id1, sink, NULL);
gst_bin_add_many (GST_BIN (thread), bin, NULL);
gst_bin_add_many (GST_BIN (pipeline), src, queue, thread, NULL);
gst_element_link_pads (src, "src", queue, "sink");
gst_element_link_pads (queue, "src", id1, "sink");
gst_element_link_pads (id1, "src", sink, "sink");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
g_print ("unlinking...\n");
gst_object_ref (queue);
gst_bin_remove (GST_BIN (pipeline), queue);
gst_object_ref (bin);
gst_bin_remove (GST_BIN (thread), bin);
g_print ("done.\n");
return 0;
}

View file

@ -1,74 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gst/gst.h>
GstElement *pipeline, *src, *sink;
static void
cb_handoff (GstElement * element, GstBuffer * buffer, GstPad * pad,
gpointer unused)
{
if (GST_PAD_PEER (pad)) {
g_print ("relinking...\n");
gst_pad_unlink (pad, GST_PAD_PEER (pad));
gst_bin_remove (GST_BIN (pipeline), OTHER_ELEMENT);
OTHER_ELEMENT =
gst_element_factory_make ("fake" G_STRINGIFY (OTHER_ELEMENT), NULL);
g_assert (OTHER_ELEMENT);
gst_bin_add (GST_BIN (pipeline), OTHER_ELEMENT);
gst_element_sync_state_with_parent (OTHER_ELEMENT);
gst_element_link (ELEMENT, OTHER_ELEMENT);
}
}
gint
main (gint argc, gchar ** argv)
{
guint i = 0;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
gst_element_link (src, sink);
/* setup special stuff */
g_object_set (ELEMENT, "signal-handoffs", TRUE, NULL);
g_signal_connect (ELEMENT, "handoff", (GCallback) cb_handoff, NULL);
/* run pipeline */
g_print ("running...\n");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
while (i++ < 10 && gst_bin_iterate (GST_BIN (pipeline)));
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,65 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gst/gst.h>
static void
cb_handoff (GstElement * element, GstBuffer * buffer, GstPad * pad,
gpointer unused)
{
if (GST_PAD_PEER (pad)) {
g_print ("unlinking...\n");
gst_pad_unlink (pad, GST_PAD_PEER (pad));
}
}
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline, *src, *sink;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
gst_element_link (src, sink);
/* setup special stuff */
g_object_set (ELEMENT, "signal-handoffs", TRUE, NULL);
g_signal_connect (ELEMENT, "handoff", (GCallback) cb_handoff, NULL);
/* run pipeline */
g_print ("running...\n");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
while (gst_bin_iterate (GST_BIN (pipeline)));
g_print ("cleaning up...\n");
gst_object_unref (pipeline);
pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,62 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gst/gst.h>
GstElement *pipeline, *src, *sink;
static void
cb_handoff (GstElement * element, GstBuffer * buffer, GstPad * pad,
gpointer unused)
{
if (pipeline) {
g_print ("unreffing...\n");
gst_object_unref (pipeline);
pipeline = NULL;
}
}
gint
main (gint argc, gchar ** argv)
{
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_element_factory_make ("pipeline", NULL);
g_assert (pipeline);
src = gst_element_factory_make ("fakesrc", NULL);
g_assert (src);
sink = gst_element_factory_make ("fakesink", NULL);
g_assert (sink);
gst_bin_add_many (GST_BIN (pipeline), src, sink, NULL);
gst_element_link (src, sink);
/* setup special stuff */
g_object_set (ELEMENT, "signal-handoffs", TRUE, NULL);
g_signal_connect (ELEMENT, "handoff", (GCallback) cb_handoff, NULL);
/* run pipeline */
g_print ("running...\n");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
while (pipeline && gst_bin_iterate (GST_BIN (pipeline)));
g_print ("done.\n");
return 0;
}

View file

@ -1,51 +0,0 @@
/* GStreamer
* Copyright (C) 2004 Benjamin Otte <in7y118@public.uni-hamburg.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU 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
* General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this library; if not, write to the Free
* Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <gst/gst.h>
gint
main (gint argc, gchar ** argv)
{
GstElement *pipeline;
GError *error = NULL;
guint i = 0;
gst_init (&argc, &argv);
g_print ("setting up...\n");
/* setup pipeline */
pipeline = gst_parse_launch ("pipeline.( { fakesrc ! fakesink } )", &error);
g_assert (error == NULL);
g_assert (pipeline);
/* run pipeline */
g_print ("running...\n");
if (gst_element_set_state (pipeline,
GST_STATE_PLAYING) != GST_STATE_CHANGE_SUCCESS)
g_assert_not_reached ();
while (i < 100 && gst_bin_iterate (GST_BIN (pipeline)))
i++;
g_print ("cleaning up... (%d iterations)\n", i);
g_assert (i == 100);
gst_object_unref (pipeline);
pipeline = NULL;
g_print ("done.\n");
return 0;
}

View file

@ -1,7 +1,7 @@
/* GStreamer
* Copyright (C) <2004> Benjamin Otte <otte@gnome.org>
*
* bin.c:
* bin.c:
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public