diff --git a/ChangeLog b/ChangeLog index d67558be55..0aebebb323 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-07-21 Andy Wingo + + * libs/gst/check/Makefile.am + (libgstcheck_@GST_MAJORMINOR@include_HEADERS) + (libgstcheck_@GST_MAJORMINOR@_la_SOURCES): + * libs/gst/check/gstbufferstraw.h: + * libs/gst/check/gstbufferstraw.c: Add some new hype testing + functions, thus proving I am still a GStreamer haxor. OK I wrote + them a long time ago, but anyways. + 2006-07-21 Stefan Kost * configure.ac: diff --git a/libs/gst/check/Makefile.am b/libs/gst/check/Makefile.am index 8d713043e8..26301f6332 100644 --- a/libs/gst/check/Makefile.am +++ b/libs/gst/check/Makefile.am @@ -3,6 +3,7 @@ lib_LTLIBRARIES = libgstcheck-@GST_MAJORMINOR@.la libgstcheck_@GST_MAJORMINOR@_la_DEPENDENCIES = \ $(top_builddir)/gst/libgstreamer-@GST_MAJORMINOR@.la libgstcheck_@GST_MAJORMINOR@_la_SOURCES = \ + gstbufferstraw.c \ gstcheck.c libgstcheck_@GST_MAJORMINOR@_la_CFLAGS = $(GST_OBJ_CFLAGS) $(CHECK_CFLAGS) @@ -15,6 +16,7 @@ libgstcheck_@GST_MAJORMINOR@includedir = \ $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/check libgstcheck_@GST_MAJORMINOR@include_HEADERS = \ + gstbufferstraw.h \ gstcheck.h CLEANFILES = *.gcno *.gcda *.gcov diff --git a/libs/gst/check/gstbufferstraw.c b/libs/gst/check/gstbufferstraw.c new file mode 100644 index 0000000000..e4cbce4f28 --- /dev/null +++ b/libs/gst/check/gstbufferstraw.c @@ -0,0 +1,165 @@ +/* GStreamer + * + * unit testing helper lib + * + * Copyright (C) 2006 Andy Wingo + * + * 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. + */ + +#include "gstbufferstraw.h" + +static GCond *cond = NULL; +static GMutex *lock = NULL; +static GstBuffer *buf = NULL; +static gulong id; + +/* called for every buffer. Waits until the global "buf" variable is unset, + * then sets it to the buffer received, and signals. */ +static gboolean +buffer_probe (GstPad * pad, GstBuffer * buffer, gpointer unused) +{ + g_mutex_lock (lock); + + while (buf != NULL) + g_cond_wait (cond, lock); + + /* increase the refcount because we store it globally for others to use */ + buf = gst_buffer_ref (buffer); + + g_cond_signal (cond); + + g_mutex_unlock (lock); + + return TRUE; +} + +/** + * gst_buffer_straw_start_pipeline: + * @bin: the pipeline to run + * @pad: a pad on an element in @bin + * + * Sets up a pipeline for buffer sucking. This will allow you to call + * gst_buffer_straw_get_buffer() to access buffers as they pass over @pad. + * + * This function is normally used in unit tests that want to verify that a + * particular element is outputting correct buffers. For example, you would make + * a pipeline via gst_parse_launch(), pull out the pad you want to monitor, then + * call gst_buffer_straw_get_buffer() to get the buffers that pass through @pad. + * The pipeline will block until you have sucked off the buffers. + * + * This function will set the state of @bin to PLAYING; to clean up, be sure to + * call gst_buffer_straw_stop_pipeline(). + * + * Note that you may not start two buffer straws at the same time. This function + * is intended for unit tests, not general API use. In fact it calls fail_if + * from libcheck, so you cannot use it outside unit tests. + */ +void +gst_buffer_straw_start_pipeline (GstElement * bin, GstPad * pad) +{ + GstStateChangeReturn ret; + + id = gst_pad_add_buffer_probe (pad, G_CALLBACK (buffer_probe), NULL); + + cond = g_cond_new (); + lock = g_mutex_new (); + + ret = gst_element_set_state (bin, GST_STATE_PLAYING); + fail_if (ret == GST_STATE_CHANGE_FAILURE, "Could not start test pipeline"); + if (ret == GST_STATE_CHANGE_ASYNC) { + ret = gst_element_get_state (bin, NULL, NULL, GST_CLOCK_TIME_NONE); + fail_if (ret != GST_STATE_CHANGE_SUCCESS, "Could not start test pipeline"); + } +} + +/** + * gst_buffer_straw_get_buffer: + * @bin: the pipeline previously started via gst_buffer_straw_start_pipeline() + * @pad: the pad previously passed to gst_buffer_straw_start_pipeline() + * + * Get one buffer from @pad. Implemented via buffer probes. This function will + * block until the pipeline passes a buffer over @pad, so for robust behavior + * in unit tests, you need to use check's timeout to fail out in the case that a + * buffer never arrives. + * + * You must have previously called gst_buffer_straw_start_pipeline() on + * @pipeline and @pad. + */ +GstBuffer * +gst_buffer_straw_get_buffer (GstElement * bin, GstPad * pad) +{ + GstBuffer *ret; + + g_mutex_lock (lock); + + while (buf == NULL) + g_cond_wait (cond, lock); + + ret = buf; + buf = NULL; + + g_cond_signal (cond); + + g_mutex_unlock (lock); + + return ret; +} + +/** + * gst_buffer_straw_stop_pipeline: + * @bin: the pipeline previously started via gst_buffer_straw_start_pipeline() + * @pad: the pad previously passed to gst_buffer_straw_start_pipeline() + * + * Set @bin to #GST_STATE_NULL and release resource allocated in + * gst_buffer_straw_start_pipeline(). + * + * You must have previously called gst_buffer_straw_start_pipeline() on + * @pipeline and @pad. + */ +void +gst_buffer_straw_stop_pipeline (GstElement * bin, GstPad * pad) +{ + GstStateChangeReturn ret; + + g_mutex_lock (lock); + if (buf) + gst_buffer_unref (buf); + buf = NULL; + gst_pad_remove_buffer_probe (pad, (guint) id); + id = 0; + g_cond_signal (cond); + g_mutex_unlock (lock); + + ret = gst_element_set_state (bin, GST_STATE_NULL); + fail_if (ret == GST_STATE_CHANGE_FAILURE, "Could not stop test pipeline"); + if (ret == GST_STATE_CHANGE_ASYNC) { + ret = gst_element_get_state (bin, NULL, NULL, GST_CLOCK_TIME_NONE); + fail_if (ret != GST_STATE_CHANGE_SUCCESS, "Could not stop test pipeline"); + } + + g_mutex_lock (lock); + if (buf) + gst_buffer_unref (buf); + buf = NULL; + g_mutex_unlock (lock); + + g_mutex_free (lock); + g_cond_free (cond); + + lock = NULL; + cond = NULL; +} diff --git a/libs/gst/check/gstbufferstraw.h b/libs/gst/check/gstbufferstraw.h new file mode 100644 index 0000000000..3eba3936fe --- /dev/null +++ b/libs/gst/check/gstbufferstraw.h @@ -0,0 +1,33 @@ +/* GStreamer + * + * Copyright (C) 2006 Andy Wingo + * + * 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. + */ + +#ifndef __GST_BUFFER_STRAW_H__ +#define __GST_BUFFER_STRAW_H__ + + +#include + + +void gst_buffer_straw_start_pipeline (GstElement * bin, GstPad * pad); +GstBuffer *gst_buffer_straw_get_buffer (GstElement * bin, GstPad * pad); +void gst_buffer_straw_stop_pipeline (GstElement * bin, GstPad * pad); + + +#endif /* __GST_BUFFER_STRAW_H__ */ diff --git a/win32/common/config.h b/win32/common/config.h index 3719e6f607..47ee17da9f 100644 --- a/win32/common/config.h +++ b/win32/common/config.h @@ -175,7 +175,7 @@ #define HAVE_WIN32 1 /* Define host CPU */ -#define HOST_CPU "i686" +#define HOST_CPU "x86_64" /* library dir */ #ifdef _DEBUG