mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-06 07:28:53 +00:00
Fix extended message handling with gst_bus_pop_timed_filtered()
Make sure extended message types don't get accidentally matched when not asked for in the mask
This commit is contained in:
parent
44f0be4ee6
commit
4d7d3a1c02
3 changed files with 85 additions and 21 deletions
17
gst/gstbus.c
17
gst/gstbus.c
|
@ -505,13 +505,18 @@ gst_bus_timed_pop_filtered (GstBus * bus, GstClockTime timeout,
|
||||||
message, GST_MESSAGE_TYPE_NAME (message),
|
message, GST_MESSAGE_TYPE_NAME (message),
|
||||||
GST_MESSAGE_SRC_NAME (message), (guint) types);
|
GST_MESSAGE_SRC_NAME (message), (guint) types);
|
||||||
if ((GST_MESSAGE_TYPE (message) & types) != 0) {
|
if ((GST_MESSAGE_TYPE (message) & types) != 0) {
|
||||||
/* exit the loop, we have a message */
|
/* Extra check to ensure extended types don't get matched unless
|
||||||
goto beach;
|
* asked for */
|
||||||
} else {
|
if ((GST_MESSAGE_TYPE_IS_EXTENDED (message) == FALSE)
|
||||||
GST_DEBUG_OBJECT (bus, "discarding message, does not match mask");
|
|| (types & GST_MESSAGE_EXTENDED)) {
|
||||||
gst_message_unref (message);
|
/* exit the loop, we have a message */
|
||||||
message = NULL;
|
goto beach;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (bus, "discarding message, does not match mask");
|
||||||
|
gst_message_unref (message);
|
||||||
|
message = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* no need to wait, exit loop */
|
/* no need to wait, exit loop */
|
||||||
|
|
|
@ -187,6 +187,15 @@ typedef enum
|
||||||
* Get the #GstMessageType of @message.
|
* Get the #GstMessageType of @message.
|
||||||
*/
|
*/
|
||||||
#define GST_MESSAGE_TYPE(message) (GST_MESSAGE_CAST(message)->type)
|
#define GST_MESSAGE_TYPE(message) (GST_MESSAGE_CAST(message)->type)
|
||||||
|
/**
|
||||||
|
* GST_MESSAGE_TYPE_IS_EXTENDED:
|
||||||
|
* @message: a #GstMessage
|
||||||
|
*
|
||||||
|
* Check if the message is in the extended message group
|
||||||
|
* (Since 1.4)
|
||||||
|
*/
|
||||||
|
#define GST_MESSAGE_TYPE_IS_EXTENDED(message) (!!(GST_MESSAGE_CAST(message)->type & GST_MESSAGE_EXTENDED))
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GST_MESSAGE_TYPE_NAME:
|
* GST_MESSAGE_TYPE_NAME:
|
||||||
* @message: a #GstMessage
|
* @message: a #GstMessage
|
||||||
|
|
|
@ -23,6 +23,8 @@
|
||||||
static GstBus *test_bus = NULL;
|
static GstBus *test_bus = NULL;
|
||||||
static GMainLoop *main_loop;
|
static GMainLoop *main_loop;
|
||||||
|
|
||||||
|
static GType foo_device_get_type (void);
|
||||||
|
|
||||||
#define NUM_MESSAGES 1000
|
#define NUM_MESSAGES 1000
|
||||||
#define NUM_THREADS 10
|
#define NUM_THREADS 10
|
||||||
|
|
||||||
|
@ -295,7 +297,7 @@ message_func (GstBus * bus, GstMessage * message, gpointer data)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_5app_1el_1err_2app_messages (guint interval_usecs)
|
send_5app_1el_1err_2app_1eos_messages (guint interval_usecs)
|
||||||
{
|
{
|
||||||
GstMessage *m;
|
GstMessage *m;
|
||||||
GstStructure *s;
|
GstStructure *s;
|
||||||
|
@ -328,8 +330,36 @@ send_5app_1el_1err_2app_messages (guint interval_usecs)
|
||||||
gst_bus_post (test_bus, m);
|
gst_bus_post (test_bus, m);
|
||||||
g_usleep (interval_usecs);
|
g_usleep (interval_usecs);
|
||||||
}
|
}
|
||||||
|
for (i = 0; i < 1; i++) {
|
||||||
|
m = gst_message_new_eos (NULL);
|
||||||
|
GST_LOG ("posting EOS message");
|
||||||
|
gst_bus_post (test_bus, m);
|
||||||
|
g_usleep (interval_usecs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
send_extended_messages (guint interval_usecs)
|
||||||
|
{
|
||||||
|
GstMessage *msg;
|
||||||
|
GstDevice *device;
|
||||||
|
|
||||||
|
device = g_object_new (foo_device_get_type (), NULL);
|
||||||
|
|
||||||
|
msg = gst_message_new_device_added (NULL, device);
|
||||||
|
GST_LOG ("posting device-added message");
|
||||||
|
gst_bus_post (test_bus, msg);
|
||||||
|
g_usleep (interval_usecs);
|
||||||
|
|
||||||
|
msg = gst_message_new_device_removed (NULL, device);
|
||||||
|
GST_LOG ("posting device-removed message");
|
||||||
|
gst_bus_post (test_bus, msg);
|
||||||
|
g_usleep (interval_usecs);
|
||||||
|
|
||||||
|
gst_object_unref (device);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
send_10_app_messages (void)
|
send_10_app_messages (void)
|
||||||
{
|
{
|
||||||
|
@ -390,8 +420,6 @@ GST_START_TEST (test_timed_pop)
|
||||||
|
|
||||||
GST_END_TEST;
|
GST_END_TEST;
|
||||||
|
|
||||||
static GType foo_device_get_type (void);
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
GstDevice device;
|
GstDevice device;
|
||||||
|
@ -444,7 +472,7 @@ GST_START_TEST (test_timed_pop_filtered)
|
||||||
msg = gst_bus_timed_pop_filtered (test_bus, 0, GST_MESSAGE_ANY);
|
msg = gst_bus_timed_pop_filtered (test_bus, 0, GST_MESSAGE_ANY);
|
||||||
fail_unless (msg == NULL);
|
fail_unless (msg == NULL);
|
||||||
|
|
||||||
send_5app_1el_1err_2app_messages (0);
|
send_5app_1el_1err_2app_1eos_messages (0);
|
||||||
msg = gst_bus_timed_pop_filtered (test_bus, 0,
|
msg = gst_bus_timed_pop_filtered (test_bus, 0,
|
||||||
GST_MESSAGE_ANY ^ GST_MESSAGE_APPLICATION);
|
GST_MESSAGE_ANY ^ GST_MESSAGE_APPLICATION);
|
||||||
fail_unless (msg != NULL);
|
fail_unless (msg != NULL);
|
||||||
|
@ -458,23 +486,45 @@ GST_START_TEST (test_timed_pop_filtered)
|
||||||
msg = gst_bus_timed_pop_filtered (test_bus, 0, GST_MESSAGE_ERROR);
|
msg = gst_bus_timed_pop_filtered (test_bus, 0, GST_MESSAGE_ERROR);
|
||||||
fail_unless (msg == NULL);
|
fail_unless (msg == NULL);
|
||||||
|
|
||||||
send_5app_1el_1err_2app_messages (0);
|
gst_object_unref (test_bus);
|
||||||
{
|
|
||||||
GstDevice *device;
|
|
||||||
|
|
||||||
device = g_object_new (foo_device_get_type (), NULL);
|
/* Test extended messages */
|
||||||
msg = gst_message_new_device_added (NULL, device);
|
GST_DEBUG
|
||||||
gst_object_unref (device);
|
("Checking extended messages received from gst_bus_timed_pop_filtered");
|
||||||
|
test_bus = gst_bus_new ();
|
||||||
|
|
||||||
GST_LOG ("posting device message");
|
send_5app_1el_1err_2app_1eos_messages (0);
|
||||||
gst_bus_post (test_bus, msg);
|
send_extended_messages (0);
|
||||||
}
|
send_5app_1el_1err_2app_1eos_messages (0);
|
||||||
send_5app_1el_1err_2app_messages (0);
|
|
||||||
msg = gst_bus_timed_pop_filtered (test_bus, 0, GST_MESSAGE_EXTENDED);
|
msg = gst_bus_timed_pop_filtered (test_bus, 0, GST_MESSAGE_EXTENDED);
|
||||||
fail_unless (msg != NULL);
|
fail_unless (msg != NULL);
|
||||||
fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_DEVICE_ADDED);
|
fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_DEVICE_ADDED);
|
||||||
gst_message_unref (msg);
|
gst_message_unref (msg);
|
||||||
|
|
||||||
|
msg = gst_bus_timed_pop_filtered (test_bus, 0, GST_MESSAGE_EXTENDED);
|
||||||
|
fail_unless (msg != NULL);
|
||||||
|
fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_DEVICE_REMOVED);
|
||||||
|
gst_message_unref (msg);
|
||||||
|
gst_object_unref (test_bus);
|
||||||
|
|
||||||
|
/* Now check extended messages don't appear when we don't ask for them */
|
||||||
|
GST_DEBUG
|
||||||
|
("Checking extended messages *not* received from gst_bus_timed_pop_filtered when not wanted");
|
||||||
|
test_bus = gst_bus_new ();
|
||||||
|
|
||||||
|
send_extended_messages (0);
|
||||||
|
send_5app_1el_1err_2app_1eos_messages (0);
|
||||||
|
|
||||||
|
msg = gst_bus_timed_pop_filtered (test_bus, 0, GST_MESSAGE_ERROR);
|
||||||
|
fail_unless (msg != NULL);
|
||||||
|
fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_ERROR);
|
||||||
|
gst_message_unref (msg);
|
||||||
|
|
||||||
|
msg = gst_bus_timed_pop_filtered (test_bus, 0, GST_MESSAGE_EOS);
|
||||||
|
fail_unless (msg != NULL);
|
||||||
|
fail_unless_equals_int (GST_MESSAGE_TYPE (msg), GST_MESSAGE_EOS);
|
||||||
|
gst_message_unref (msg);
|
||||||
|
|
||||||
gst_object_unref (test_bus);
|
gst_object_unref (test_bus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -484,7 +534,7 @@ static gpointer
|
||||||
post_delayed_thread (gpointer data)
|
post_delayed_thread (gpointer data)
|
||||||
{
|
{
|
||||||
THREAD_START ();
|
THREAD_START ();
|
||||||
send_5app_1el_1err_2app_messages (1 * G_USEC_PER_SEC);
|
send_5app_1el_1err_2app_1eos_messages (1 * G_USEC_PER_SEC);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue