+2005-08-05 Thomas Vander Stichele <thomas at apestaart dot org>
+
+ * check/elements/gstfakesrc.c: (setup_fakesrc), (cleanup_fakesrc),
+ (GST_START_TEST), (fakesrc_suite):
+ add tests for sizetype
+
2005-08-04 Andy Wingo <wingo@pobox.com>
* gst/elements/gstcapsfilter.c: Reimplement using basetransform,
return FALSE;
}
-GST_START_TEST (test_num_buffers)
+GstElement *
+setup_fakesrc ()
{
GstElement *src;
GstPad *srcpad, *sinkpad;
"sink");
fail_if (sinkpad == NULL, "Could not create a sinkpad");
- g_object_set (G_OBJECT (src), "num-buffers", 3, NULL);
-
srcpad = gst_element_get_pad (src, "src");
fail_if (srcpad == NULL, "Could not get source pad from fakesrc");
gst_pad_set_caps (sinkpad, NULL);
fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK,
"Could not link source and sink pads");
+ return src;
+}
+
+void
+cleanup_fakesrc (GstElement * src)
+{
+ GstPad *srcpad, *sinkpad;
+
+ fail_unless (gst_element_set_state (src, GST_STATE_NULL) == GST_STATE_SUCCESS,
+ "could not set to null");
+
+ srcpad = gst_element_get_pad (src, "src");
+ sinkpad = gst_pad_get_peer (srcpad);
+
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ gst_object_unref (src);
+
+ gst_pad_unlink (srcpad, sinkpad);
+
+ /* pad refs held by both creator and this function (through _get) */
+ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2);
+ gst_object_unref (srcpad);
+ gst_object_unref (srcpad);
+
+ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
+ gst_object_unref (sinkpad);
+ gst_object_unref (sinkpad);
+}
+
+GST_START_TEST (test_num_buffers)
+{
+ GstElement *src;
+ src = setup_fakesrc ();
+ g_object_set (G_OBJECT (src), "num-buffers", 3, NULL);
fail_unless (gst_element_set_state (src,
GST_STATE_PLAYING) == GST_STATE_SUCCESS, "could not set to playing");
g_list_free (buffers);
/* cleanup */
- fail_unless (gst_element_set_state (src, GST_STATE_NULL) == GST_STATE_SUCCESS,
- "could not set to null");
+ cleanup_fakesrc (src);
+}
- gst_object_unref (src);
- gst_object_unref (sinkpad);
+GST_END_TEST;
+
+GST_START_TEST (test_sizetype_empty)
+{
+ GstElement *src;
+ GList *l;
+
+ src = setup_fakesrc ();
+
+ g_object_set (G_OBJECT (src), "sizetype", 1, NULL);
+ g_object_set (G_OBJECT (src), "num-buffers", 100, NULL);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PLAYING) == GST_STATE_SUCCESS, "could not set to playing");
+
+ while (!have_eos) {
+ g_usleep (1000);
+ }
+
+ fail_unless (g_list_length (buffers) == 100);
+ l = buffers;
+ while (l) {
+ GstBuffer *buf = l->data;
+
+ fail_unless (GST_BUFFER_SIZE (buf) == 0);
+ l = l->next;
+ }
+ g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (buffers);
+
+ /* cleanup */
+ cleanup_fakesrc (src);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_sizetype_fixed)
+{
+ GstElement *src;
+ GList *l;
+
+ src = setup_fakesrc ();
+
+ g_object_set (G_OBJECT (src), "sizetype", 2, NULL);
+ g_object_set (G_OBJECT (src), "sizemax", 8192, NULL);
+ g_object_set (G_OBJECT (src), "num-buffers", 100, NULL);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PLAYING) == GST_STATE_SUCCESS, "could not set to playing");
+
+ while (!have_eos) {
+ g_usleep (1000);
+ }
+
+ fail_unless (g_list_length (buffers) == 100);
+ l = buffers;
+ while (l) {
+ GstBuffer *buf = l->data;
+
+ fail_unless (GST_BUFFER_SIZE (buf) == 8192);
+ l = l->next;
+ }
+ g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (buffers);
+
+ /* cleanup */
+ cleanup_fakesrc (src);
}
GST_END_TEST;
+GST_START_TEST (test_sizetype_random)
+{
+ GstElement *src;
+ GList *l;
+
+ src = setup_fakesrc ();
+
+ g_object_set (G_OBJECT (src), "sizetype", 3, NULL);
+ g_object_set (G_OBJECT (src), "sizemin", 4096, NULL);
+ g_object_set (G_OBJECT (src), "sizemax", 8192, NULL);
+ g_object_set (G_OBJECT (src), "num-buffers", 100, NULL);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PLAYING) == GST_STATE_SUCCESS, "could not set to playing");
+
+ while (!have_eos) {
+ g_usleep (1000);
+ }
+
+ fail_unless (g_list_length (buffers) == 100);
+ l = buffers;
+ while (l) {
+ GstBuffer *buf = l->data;
+
+ fail_if (GST_BUFFER_SIZE (buf) > 8192);
+ fail_if (GST_BUFFER_SIZE (buf) < 4096);
+ l = l->next;
+ }
+ g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (buffers);
+
+ /* cleanup */
+ cleanup_fakesrc (src);
+}
+
+GST_END_TEST;
+
+
Suite *
fakesrc_suite (void)
{
suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_num_buffers);
+ tcase_add_test (tc_chain, test_sizetype_empty);
+ tcase_add_test (tc_chain, test_sizetype_fixed);
+ tcase_add_test (tc_chain, test_sizetype_random);
return s;
}
pipeline</ulink> and Microsoft's DirectShow for some background.
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### FUNCTION gst_init ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstBaseSink ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstBaseSrc ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstBaseTransform ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstBin ##### -->
<para>
#GstPad, #GstMiniObject
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstBuffer ##### -->
<para>
The basic structure of a buffer.
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstCaps ##### -->
<para>
#GstSystemClock
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstClock ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### MACRO GST_DISABLE_LOADSAVE_REGISTRY ##### -->
<para>
<!-- basic object functions -->
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstElement ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstElementDetails ##### -->
<para>
This struct is used to define public information about the element. It
#GstElement, #GstPlugin, #GstPluginFeature, #GstPadTemplate.
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstElementFactory ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### ENUM GstCoreError ##### -->
<para>
#GstPad, #GstElement
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstEvent ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstFakeSink ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstFakeSrc ##### -->
<para>
@:
@:
@:
+@:
@:
<!-- ##### ARG GstFakeSrc:data ##### -->
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstFileSink ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstFileSrc ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### USER_FUNCTION GstFilterFunc ##### -->
<para>
#GstPad, #GstElement
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### ENUM GstFormat ##### -->
<para>
Standard predefined formats
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstGhostPad ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstImplementsInterface ##### -->
<para>
#GstIndexFactory
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstIndex ##### -->
<para>
#GstIndex
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstIndexFactory ##### -->
<para>
The GstIndexFactory object
and environment variables that affect the debugging output.
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### ENUM GstDebugLevel ##### -->
<para>
The level defines the importance of a debugging message. The more important a
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstIterator ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
#GstBuffer, #GstEvent, #GstData
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstMemChunk ##### -->
<para>
The memchunk structure
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstMiniObject ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstObject ##### -->
<para>
#GstPadTemplate, #GstElement, #GstEvent
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstPad ##### -->
<para>
#GstPad, #GstElementFactory
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstPadTemplate ##### -->
<para>
The padtemplate object.
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### FUNCTION gst_parse_error_quark ##### -->
<para>
#GstBin
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstPipeline ##### -->
<para>
#GstPluginFeature, #GstType, #GstAutoplug, #GstElementFactory
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### FUNCTION gst_plugin_error_quark ##### -->
<para>
Get the error quark
#GstPlugin
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstPluginFeature ##### -->
<para>
#GstPad, #GstElement
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### ENUM GstQueryType ##### -->
<para>
Standard predefined Query types
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstQueue ##### -->
<para>
#GstPlugin, #GstPluginFeature
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
GstRegistry
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### FUNCTION gst_registry_pool_list ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstStructure ##### -->
<para>
#GstClock
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstSystemClock ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### TYPEDEF GstTagList ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstTagSetter ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstTrace ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstTrashStack ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstTypeFind ##### -->
<para>
<link linkend="gstreamer-Writing-typefind-functions">Writing typefind functions</link>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstTypeFindFactory ##### -->
<para>
Object that stores information about a typefind function
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### ENUM GstElementState ##### -->
<para>
These contants describe the state a #GstElement is in and transition scheduled for the #GstElement (the pending state).
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstURIHandler ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### ENUM GstURIType ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### FUNCTION gst_util_set_value_from_string ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### MACRO GST_MAKE_FOURCC ##### -->
<para>
will transform four characters into a host-endiannness guint32 fourcc:
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### MACRO GST_VERSION_MAJOR ##### -->
<para>
The major version of GStreamer at compile time
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT GstXML ##### -->
<para>
#GstBuffer, #GstCaps, #GstEvent
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### ENUM GstDPHeaderFlag ##### -->
<para>
</para>
-<!-- ##### SECTION Stability_Level ##### -->
-
-
<!-- ##### STRUCT gst_getbits_t ##### -->
<para>
return FALSE;
}
-GST_START_TEST (test_num_buffers)
+GstElement *
+setup_fakesrc ()
{
GstElement *src;
GstPad *srcpad, *sinkpad;
"sink");
fail_if (sinkpad == NULL, "Could not create a sinkpad");
- g_object_set (G_OBJECT (src), "num-buffers", 3, NULL);
-
srcpad = gst_element_get_pad (src, "src");
fail_if (srcpad == NULL, "Could not get source pad from fakesrc");
gst_pad_set_caps (sinkpad, NULL);
fail_unless (gst_pad_link (srcpad, sinkpad) == GST_PAD_LINK_OK,
"Could not link source and sink pads");
+ return src;
+}
+
+void
+cleanup_fakesrc (GstElement * src)
+{
+ GstPad *srcpad, *sinkpad;
+
+ fail_unless (gst_element_set_state (src, GST_STATE_NULL) == GST_STATE_SUCCESS,
+ "could not set to null");
+
+ srcpad = gst_element_get_pad (src, "src");
+ sinkpad = gst_pad_get_peer (srcpad);
+
+ ASSERT_OBJECT_REFCOUNT (src, "src", 1);
+ gst_object_unref (src);
+
+ gst_pad_unlink (srcpad, sinkpad);
+
+ /* pad refs held by both creator and this function (through _get) */
+ ASSERT_OBJECT_REFCOUNT (srcpad, "srcpad", 2);
+ gst_object_unref (srcpad);
+ gst_object_unref (srcpad);
+
+ ASSERT_OBJECT_REFCOUNT (sinkpad, "sinkpad", 2);
+ gst_object_unref (sinkpad);
+ gst_object_unref (sinkpad);
+}
+
+GST_START_TEST (test_num_buffers)
+{
+ GstElement *src;
+ src = setup_fakesrc ();
+ g_object_set (G_OBJECT (src), "num-buffers", 3, NULL);
fail_unless (gst_element_set_state (src,
GST_STATE_PLAYING) == GST_STATE_SUCCESS, "could not set to playing");
g_list_free (buffers);
/* cleanup */
- fail_unless (gst_element_set_state (src, GST_STATE_NULL) == GST_STATE_SUCCESS,
- "could not set to null");
+ cleanup_fakesrc (src);
+}
- gst_object_unref (src);
- gst_object_unref (sinkpad);
+GST_END_TEST;
+
+GST_START_TEST (test_sizetype_empty)
+{
+ GstElement *src;
+ GList *l;
+
+ src = setup_fakesrc ();
+
+ g_object_set (G_OBJECT (src), "sizetype", 1, NULL);
+ g_object_set (G_OBJECT (src), "num-buffers", 100, NULL);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PLAYING) == GST_STATE_SUCCESS, "could not set to playing");
+
+ while (!have_eos) {
+ g_usleep (1000);
+ }
+
+ fail_unless (g_list_length (buffers) == 100);
+ l = buffers;
+ while (l) {
+ GstBuffer *buf = l->data;
+
+ fail_unless (GST_BUFFER_SIZE (buf) == 0);
+ l = l->next;
+ }
+ g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (buffers);
+
+ /* cleanup */
+ cleanup_fakesrc (src);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_sizetype_fixed)
+{
+ GstElement *src;
+ GList *l;
+
+ src = setup_fakesrc ();
+
+ g_object_set (G_OBJECT (src), "sizetype", 2, NULL);
+ g_object_set (G_OBJECT (src), "sizemax", 8192, NULL);
+ g_object_set (G_OBJECT (src), "num-buffers", 100, NULL);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PLAYING) == GST_STATE_SUCCESS, "could not set to playing");
+
+ while (!have_eos) {
+ g_usleep (1000);
+ }
+
+ fail_unless (g_list_length (buffers) == 100);
+ l = buffers;
+ while (l) {
+ GstBuffer *buf = l->data;
+
+ fail_unless (GST_BUFFER_SIZE (buf) == 8192);
+ l = l->next;
+ }
+ g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (buffers);
+
+ /* cleanup */
+ cleanup_fakesrc (src);
}
GST_END_TEST;
+GST_START_TEST (test_sizetype_random)
+{
+ GstElement *src;
+ GList *l;
+
+ src = setup_fakesrc ();
+
+ g_object_set (G_OBJECT (src), "sizetype", 3, NULL);
+ g_object_set (G_OBJECT (src), "sizemin", 4096, NULL);
+ g_object_set (G_OBJECT (src), "sizemax", 8192, NULL);
+ g_object_set (G_OBJECT (src), "num-buffers", 100, NULL);
+
+ fail_unless (gst_element_set_state (src,
+ GST_STATE_PLAYING) == GST_STATE_SUCCESS, "could not set to playing");
+
+ while (!have_eos) {
+ g_usleep (1000);
+ }
+
+ fail_unless (g_list_length (buffers) == 100);
+ l = buffers;
+ while (l) {
+ GstBuffer *buf = l->data;
+
+ fail_if (GST_BUFFER_SIZE (buf) > 8192);
+ fail_if (GST_BUFFER_SIZE (buf) < 4096);
+ l = l->next;
+ }
+ g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
+ g_list_free (buffers);
+
+ /* cleanup */
+ cleanup_fakesrc (src);
+}
+
+GST_END_TEST;
+
+
Suite *
fakesrc_suite (void)
{
suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_num_buffers);
+ tcase_add_test (tc_chain, test_sizetype_empty);
+ tcase_add_test (tc_chain, test_sizetype_fixed);
+ tcase_add_test (tc_chain, test_sizetype_random);
return s;
}