[gst-cvs] gst-plugins-good: imagefreeze: Fix race conditions in the unit test
Sebastian Dröge
slomo at kemper.freedesktop.org
Sat Sep 4 05:56:24 PDT 2010
Module: gst-plugins-good
Branch: master
Commit: 5cd240952e9c9a6dfbbac854d5c1bef8d970ff1e
URL: http://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=5cd240952e9c9a6dfbbac854d5c1bef8d970ff1e
Author: Sebastian Dröge <sebastian.droege at collabora.co.uk>
Date: Fri Aug 20 10:35:15 2010 +0200
imagefreeze: Fix race conditions in the unit test
If setting the pipeline to PLAYING before issuing the seek, buffers
are already arriving at the sink before the seek is handled and
will have the wrong timestamps and everything.
Fixes bug #625547.
---
tests/check/elements/imagefreeze.c | 42 ++++++++++++++++++++++++++++-------
1 files changed, 33 insertions(+), 9 deletions(-)
diff --git a/tests/check/elements/imagefreeze.c b/tests/check/elements/imagefreeze.c
index eb2243d..2eacdce 100644
--- a/tests/check/elements/imagefreeze.c
+++ b/tests/check/elements/imagefreeze.c
@@ -104,6 +104,9 @@ sink_handoff_cb_0_1 (GstElement * object, GstBuffer * buffer, GstPad * pad,
{
guint *n_buffers = (guint *) user_data;
+ if (*n_buffers == G_MAXUINT)
+ return;
+
fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer), 0);
fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), GST_CLOCK_TIME_NONE);
fail_unless_equals_uint64 (GST_BUFFER_OFFSET (buffer), 0);
@@ -118,7 +121,7 @@ GST_START_TEST (test_imagefreeze_0_1)
GstCaps *caps1, *caps2;
GstBus *bus;
GMainLoop *loop;
- guint n_buffers = 0;
+ guint n_buffers = G_MAXUINT;
caps1 =
gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1);
@@ -137,6 +140,7 @@ GST_START_TEST (test_imagefreeze_0_1)
gst_bus_add_watch (bus, bus_handler, loop);
gst_object_unref (bus);
+ n_buffers = 0;
fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
GST_STATE_CHANGE_SUCCESS);
@@ -160,6 +164,9 @@ sink_handoff_cb_25_1_0ms_400ms (GstElement * object, GstBuffer * buffer,
{
guint *n_buffers = (guint *) user_data;
+ if (*n_buffers == G_MAXUINT)
+ return;
+
fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer),
*n_buffers * 40 * GST_MSECOND);
fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND);
@@ -175,7 +182,7 @@ GST_START_TEST (test_imagefreeze_25_1_0ms_400ms)
GstCaps *caps1, *caps2;
GstBus *bus;
GMainLoop *loop;
- guint n_buffers = 0;
+ guint n_buffers = G_MAXUINT;
caps1 =
gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1);
@@ -194,13 +201,15 @@ GST_START_TEST (test_imagefreeze_25_1_0ms_400ms)
gst_bus_add_watch (bus, bus_handler, loop);
gst_object_unref (bus);
- fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED),
GST_STATE_CHANGE_SUCCESS);
fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME,
GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET,
400 * GST_MSECOND));
+ n_buffers = 0;
+
fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
GST_STATE_CHANGE_SUCCESS);
@@ -224,6 +233,9 @@ sink_handoff_cb_25_1_200ms_400ms (GstElement * object, GstBuffer * buffer,
{
guint *n_buffers = (guint *) user_data;
+ if (*n_buffers == G_MAXUINT)
+ return;
+
fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer),
200 * GST_MSECOND + *n_buffers * 40 * GST_MSECOND);
fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND);
@@ -240,7 +252,7 @@ GST_START_TEST (test_imagefreeze_25_1_200ms_400ms)
GstCaps *caps1, *caps2;
GstBus *bus;
GMainLoop *loop;
- guint n_buffers = 0;
+ guint n_buffers = G_MAXUINT;
caps1 =
gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1);
@@ -259,13 +271,15 @@ GST_START_TEST (test_imagefreeze_25_1_200ms_400ms)
gst_bus_add_watch (bus, bus_handler, loop);
gst_object_unref (bus);
- fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED),
GST_STATE_CHANGE_SUCCESS);
fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME,
GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 200 * GST_MSECOND,
GST_SEEK_TYPE_SET, 400 * GST_MSECOND));
+ n_buffers = 0;
+
fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
GST_STATE_CHANGE_SUCCESS);
@@ -289,6 +303,9 @@ sink_handoff_cb_25_1_400ms_0ms (GstElement * object, GstBuffer * buffer,
{
guint *n_buffers = (guint *) user_data;
+ if (*n_buffers == G_MAXUINT)
+ return;
+
fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer),
400 * GST_MSECOND - (*n_buffers + 1) * 40 * GST_MSECOND);
fail_unless_equals_uint64 (GST_BUFFER_DURATION (buffer), 40 * GST_MSECOND);
@@ -305,7 +322,7 @@ GST_START_TEST (test_imagefreeze_25_1_400ms_0ms)
GstCaps *caps1, *caps2;
GstBus *bus;
GMainLoop *loop;
- guint n_buffers = 0;
+ guint n_buffers = G_MAXUINT;
caps1 =
gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1);
@@ -324,13 +341,15 @@ GST_START_TEST (test_imagefreeze_25_1_400ms_0ms)
gst_bus_add_watch (bus, bus_handler, loop);
gst_object_unref (bus);
- fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED),
GST_STATE_CHANGE_SUCCESS);
fail_unless (gst_element_seek (pipeline, -1.0, GST_FORMAT_TIME,
GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET,
400 * GST_MSECOND));
+ n_buffers = 0;
+
fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
GST_STATE_CHANGE_SUCCESS);
@@ -354,6 +373,9 @@ sink_handoff_cb_25_1_220ms_380ms (GstElement * object, GstBuffer * buffer,
{
guint *n_buffers = (guint *) user_data;
+ if (*n_buffers == G_MAXUINT)
+ return;
+
if (*n_buffers == 0) {
fail_unless_equals_uint64 (GST_BUFFER_TIMESTAMP (buffer),
220 * GST_MSECOND);
@@ -381,7 +403,7 @@ GST_START_TEST (test_imagefreeze_25_1_220ms_380ms)
GstCaps *caps1, *caps2;
GstBus *bus;
GMainLoop *loop;
- guint n_buffers = 0;
+ guint n_buffers = G_MAXUINT;
caps1 =
gst_video_format_new_caps (GST_VIDEO_FORMAT_xRGB, 640, 480, 25, 1, 1, 1);
@@ -400,13 +422,15 @@ GST_START_TEST (test_imagefreeze_25_1_220ms_380ms)
gst_bus_add_watch (bus, bus_handler, loop);
gst_object_unref (bus);
- fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
+ fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PAUSED),
GST_STATE_CHANGE_SUCCESS);
fail_unless (gst_element_seek (pipeline, 1.0, GST_FORMAT_TIME,
GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, 220 * GST_MSECOND,
GST_SEEK_TYPE_SET, 380 * GST_MSECOND));
+ n_buffers = 0;
+
fail_unless_equals_int (gst_element_set_state (pipeline, GST_STATE_PLAYING),
GST_STATE_CHANGE_SUCCESS);
More information about the Gstreamer-commits
mailing list