diff --git a/ChangeLog b/ChangeLog index cf4d22c2c1..c49f36727b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2006-07-28 Jan Schmidt + + * gst/audioresample/gstaudioresample.c: (audioresample_stop), + (audioresample_set_caps): + Don't leak references to the incoming caps. Clean them up when + stopping. + + * gst/videoscale/gstvideoscale.c: (gst_video_scale_class_init), + (gst_video_scale_finalize): + Don't leak our temporary pixel buffer. + + * tests/check/Makefile.am: + * tests/check/pipelines/simple-launch-lines.c: (run_pipeline), + (GST_START_TEST), (simple_launch_lines_suite): + + Fix leaks and re-enable the test for valgrind checking. + 2006-07-28 Tim-Philipp Müller Patch by: Sjoerd Simons diff --git a/common b/common index ef97fb3278..e9ea99f6e8 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit ef97fb3278d98a1fdb32e5c6b2a7467116ffc160 +Subproject commit e9ea99f6e89d7e1af3a0a859bfeb0ed6ecf2e3a9 diff --git a/gst/audioresample/gstaudioresample.c b/gst/audioresample/gstaudioresample.c index 687a06371c..c878d02eb4 100644 --- a/gst/audioresample/gstaudioresample.c +++ b/gst/audioresample/gstaudioresample.c @@ -223,6 +223,9 @@ audioresample_stop (GstBaseTransform * base) audioresample->resample = NULL; } + gst_caps_replace (&audioresample->sinkcaps, NULL); + gst_caps_replace (&audioresample->srccaps, NULL); + return TRUE; } @@ -438,10 +441,7 @@ audioresample_set_caps (GstBaseTransform * base, GstCaps * incaps, /* save caps so we can short-circuit in the size_transform if the caps * are the same */ - /* FIXME: clean them up in state change ? */ - gst_caps_ref (incaps); gst_caps_replace (&audioresample->sinkcaps, incaps); - gst_caps_ref (outcaps); gst_caps_replace (&audioresample->srccaps, outcaps); return TRUE; diff --git a/gst/videoscale/gstvideoscale.c b/gst/videoscale/gstvideoscale.c index dbd33071ca..2694834bff 100644 --- a/gst/videoscale/gstvideoscale.c +++ b/gst/videoscale/gstvideoscale.c @@ -187,6 +187,7 @@ gst_video_scale_sink_template_factory (void) static void gst_video_scale_base_init (gpointer g_class); static void gst_video_scale_class_init (GstVideoScaleClass * klass); static void gst_video_scale_init (GstVideoScale * videoscale); +static void gst_video_scale_finalize (GstVideoScale * videoscale); static gboolean gst_video_scale_src_event (GstBaseTransform * trans, GstEvent * event); @@ -257,6 +258,7 @@ gst_video_scale_class_init (GstVideoScaleClass * klass) gobject_class = (GObjectClass *) klass; trans_class = (GstBaseTransformClass *) klass; + gobject_class->finalize = (GObjectFinalizeFunc) gst_video_scale_finalize; gobject_class->set_property = gst_video_scale_set_property; gobject_class->get_property = gst_video_scale_get_property; @@ -286,6 +288,14 @@ gst_video_scale_init (GstVideoScale * videoscale) videoscale->method = DEFAULT_PROP_METHOD; } +static void +gst_video_scale_finalize (GstVideoScale * videoscale) +{ + if (videoscale->tmp_buf) + g_free (videoscale->tmp_buf); + + G_OBJECT_CLASS (parent_class)->finalize (G_OBJECT (videoscale)); +} static void gst_video_scale_set_property (GObject * object, guint prop_id, diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am index 5b9e5fef08..858e8bb99f 100644 --- a/tests/check/Makefile.am +++ b/tests/check/Makefile.am @@ -6,7 +6,7 @@ REGISTRY_ENVIRONMENT = \ GST_REGISTRY=$(CHECK_REGISTRY) TESTS_ENVIRONMENT = \ - CK_DEFAULT_TIMEOUT=20 \ + CK_DEFAULT_TIMEOUT=120 \ $(REGISTRY_ENVIRONMENT) \ GST_PLUGIN_SYSTEM_PATH= \ GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/sys:$(top_builddir)/ext:$(GST_PLUGINS_DIR) @@ -65,8 +65,7 @@ VALGRIND_TO_FIX = \ elements/audioresample \ generic/states \ libs/cddabasesrc \ - libs/video \ - pipelines/simple-launch-lines + libs/video # these tests don't even pass noinst_PROGRAMS = diff --git a/tests/check/pipelines/simple-launch-lines.c b/tests/check/pipelines/simple-launch-lines.c index 45e552cf7f..325a8e12c8 100644 --- a/tests/check/pipelines/simple-launch-lines.c +++ b/tests/check/pipelines/simple-launch-lines.c @@ -56,7 +56,8 @@ run_pipeline (GstElement * pipe, const gchar * descr, bus = gst_element_get_bus (pipe); g_assert (bus); - ret = gst_element_set_state (pipe, GST_STATE_PLAYING); + fail_if (gst_element_set_state (pipe, GST_STATE_PLAYING) == + GST_STATE_CHANGE_FAILURE, "Could not set pipeline %s to playing", descr); ret = gst_element_get_state (pipe, NULL, NULL, GST_CLOCK_TIME_NONE); if (ret != GST_STATE_CHANGE_SUCCESS) { g_critical ("Couldn't set pipeline to PLAYING"); @@ -89,22 +90,34 @@ run_pipeline (GstElement * pipe, const gchar * descr, } done: - gst_element_set_state (pipe, GST_STATE_NULL); + fail_if (gst_element_set_state (pipe, GST_STATE_NULL) == + GST_STATE_CHANGE_FAILURE, "Could not set pipeline %s to NULL", descr); + gst_element_get_state (pipe, NULL, NULL, GST_CLOCK_TIME_NONE); gst_object_unref (pipe); + + gst_bus_set_flushing (bus, TRUE); + gst_object_unref (bus); } GST_START_TEST (test_element_negotiation) { gchar *s; - /* see http://bugzilla.gnome.org/show_bug.cgi?id=315126 */ - s = "fakesrc ! audio/x-raw-int,width=16,depth=16,rate=22050,channels=1 ! audioconvert ! audio/x-raw-int,width=16,depth=16,rate=22050,channels=1 ! fakesink"; + /* Ensures that filtering buffers with unknown caps down to fixed-caps + * will apply those caps to the buffers. + * see http://bugzilla.gnome.org/show_bug.cgi?id=315126 */ + s = "fakesrc num-buffers=2 ! " + "audio/x-raw-int,width=16,depth=16,rate=22050,channels=1," + "signed=(boolean)true,endianness=1234 ! " + "audioconvert ! audio/x-raw-int,width=16,depth=16,rate=22050,channels=1 " + "! fakesink"; run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN); #ifdef HAVE_LIBVISUAL - s = "audiotestsrc ! tee name=t ! alsasink t. ! audioconvert ! libvisual_lv_scope ! ffmpegcolorspace ! xvimagesink"; + s = "audiotestsrc num-buffers=30 ! tee name=t ! alsasink t. ! audioconvert ! " + "libvisual_lv_scope ! ffmpegcolorspace ! xvimagesink"; run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN); @@ -114,20 +127,22 @@ GST_START_TEST (test_element_negotiation) GST_END_TEST GST_START_TEST (test_basetransform_based) { - /* Each of these tests is to check whether various basetransform based elements can - * select output caps when not allowed to do passthrough and going to a generic sink - * such as fakesink or filesink */ + /* Each of these tests is to check whether various basetransform based + * elements can select output caps when not allowed to do passthrough + * and going to a generic sink such as fakesink or filesink */ const gchar *s; /* Check that videoscale can pick a height given only a width */ - s = "videotestsrc ! video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! " "videoscale ! video/x-raw-yuv,width=640 ! fakesink"; + s = "videotestsrc num-buffers=2 ! " + "video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! " + "videoscale ! video/x-raw-yuv,width=640 ! fakesink"; run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN); /* Test that ffmpegcolorspace can pick an output format that isn't * passthrough without completely specified output caps */ - s = "videotestsrc ! " + s = "videotestsrc num-buffers=2 ! " "video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! " "ffmpegcolorspace ! video/x-raw-rgb ! fakesink"; run_pipeline (setup_pipeline (s), s, @@ -136,15 +151,16 @@ GST_START_TEST (test_basetransform_based) /* Check that audioresample can pick a samplerate to use from a * range that doesn't include the input */ - s = "audiotestsrc ! audio/x-raw-int,width=16,depth=16,rate=8000 ! " + s = "audiotestsrc num-buffers=2 ! " + "audio/x-raw-int,width=16,depth=16,rate=8000 ! " "audioresample ! audio/x-raw-int,rate=[16000,48000] ! fakesink"; run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN); /* Check that audioconvert can pick a depth to use, given a width */ - s = "audiotestsrc ! audio/x-raw-int,width=16,depth=16 ! audioconvert ! " - "audio/x-raw-int,width=32 ! fakesink"; + s = "audiotestsrc num-buffers=30 ! audio/x-raw-int,width=16,depth=16 ! " + "audioconvert ! " "audio/x-raw-int,width=32 ! fakesink"; run_pipeline (setup_pipeline (s), s, GST_MESSAGE_ANY & ~(GST_MESSAGE_ERROR | GST_MESSAGE_WARNING), GST_MESSAGE_UNKNOWN); @@ -157,12 +173,12 @@ GST_END_TEST Suite *s = suite_create ("Pipelines"); TCase *tc_chain = tcase_create ("linear"); - /* time out after 20s, not the default 3 */ - tcase_set_timeout (tc_chain, 20); + /* time out after 60s, not the default 3 */ + tcase_set_timeout (tc_chain, 60); suite_add_tcase (s, tc_chain); #ifndef GST_DISABLE_PARSE -// tcase_add_test (tc_chain, test_element_negotiation); + tcase_add_test (tc_chain, test_element_negotiation); tcase_add_test (tc_chain, test_basetransform_based); #endif return s;