event: add new seek parameter, "trickmode-interval"
[platform/upstream/gstreamer.git] / tests / check / gst / gstevent.c
index 173bce1..39b5f30 100644 (file)
  *
  * 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.
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
  */
-
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
 
 #include <gst/check/gstcheck.h>
 
@@ -52,6 +54,48 @@ GST_START_TEST (create_events)
     fail_unless (reset_time == TRUE);
     gst_event_unref (event);
   }
+
+  /* SELECT_STREAMS */
+  {
+    GList *streams = NULL;
+    GList *res = NULL;
+    GList *tmp;
+    streams = g_list_append (streams, (gpointer) "stream1");
+    streams = g_list_append (streams, (gpointer) "stream2");
+    event = gst_event_new_select_streams (streams);
+    fail_if (event == NULL);
+    fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_SELECT_STREAMS);
+    fail_unless (GST_EVENT_IS_UPSTREAM (event));
+
+    gst_event_parse_select_streams (event, &res);
+    fail_if (res == NULL);
+    fail_unless_equals_int (g_list_length (res), 2);
+    tmp = res;
+    fail_unless_equals_string (tmp->data, "stream1");
+    tmp = tmp->next;
+    fail_unless_equals_string (tmp->data, "stream2");
+
+    gst_event_unref (event);
+
+    g_list_free (streams);
+    g_list_free_full (res, g_free);
+  }
+
+  /* STREAM_GROUP_DONE */
+  {
+    guint group_id = 0;
+
+    event = gst_event_new_stream_group_done (0x42);
+    fail_if (event == NULL);
+    fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_STREAM_GROUP_DONE);
+    fail_if (GST_EVENT_IS_UPSTREAM (event));
+    fail_unless (GST_EVENT_IS_DOWNSTREAM (event));
+    fail_unless (GST_EVENT_IS_SERIALIZED (event));
+    gst_event_parse_stream_group_done (event, &group_id);
+    fail_unless (group_id == 0x42);
+    gst_event_unref (event);
+  }
+
   /* EOS */
   {
     event = gst_event_new_eos ();
@@ -109,77 +153,6 @@ GST_START_TEST (create_events)
     gst_event_unref (event);
   }
 
-  /* STREAM CONFIG */
-  {
-    GstStreamConfigFlags flags = 0x987654;
-    GstBuffer *buf, *cd, *sh1, *sh2;
-    gpointer dummy;
-
-    event = gst_event_new_stream_config (GST_STREAM_CONFIG_FLAG_NONE);
-
-    gst_event_parse_stream_config (event, &flags);
-    fail_unless_equals_int (flags, GST_STREAM_CONFIG_FLAG_NONE);
-
-    fail_unless_equals_int (gst_event_get_n_stream_config_headers (event), 0);
-
-    /* set buf to something random but guaranteed to be non-NULL */
-    buf = (GstBuffer *) & dummy;
-    gst_event_parse_stream_config_setup_data (event, &buf);
-    fail_unless (buf == NULL);
-
-    buf = (GstBuffer *) & dummy;
-    gst_event_parse_nth_stream_config_header (event, 0, &buf);
-    fail_unless (buf == NULL);
-
-    buf = (GstBuffer *) & dummy;
-    gst_event_parse_nth_stream_config_header (event, 98416, &buf);
-    fail_unless (buf == NULL);
-
-    ASSERT_CRITICAL (gst_event_set_stream_config_setup_data (event, NULL));
-    ASSERT_CRITICAL (gst_event_add_stream_config_header (event, NULL));
-
-    cd = gst_buffer_new_wrapped_full (0, (gpointer) "SetMeUpScottie", 14, 0, 14,
-        NULL, NULL);
-    gst_event_set_stream_config_setup_data (event, cd);
-    gst_buffer_unref (cd);
-
-    buf = (GstBuffer *) & dummy;
-    gst_event_parse_nth_stream_config_header (event, 0, &buf);
-    fail_unless (buf == NULL);
-    gst_event_parse_stream_config_setup_data (event, &buf);
-    fail_unless (buf == cd);
-    fail_unless (GST_IS_BUFFER (buf));
-
-    gst_event_unref (event);
-
-    event = gst_event_new_stream_config (GST_STREAM_CONFIG_FLAG_NONE);
-    fail_unless_equals_int (gst_event_get_n_stream_config_headers (event), 0);
-    sh1 =
-        gst_buffer_new_wrapped_full (0, (gpointer) "Strea", 5, 0, 5, NULL,
-        NULL);
-    gst_event_add_stream_config_header (event, sh1);
-    gst_buffer_unref (sh1);
-    fail_unless_equals_int (gst_event_get_n_stream_config_headers (event), 1);
-    sh2 =
-        gst_buffer_new_wrapped_full (0, (gpointer) "mHeader", 7, 0, 7, NULL,
-        NULL);
-    gst_event_add_stream_config_header (event, sh2);
-    gst_buffer_unref (sh2);
-    fail_unless_equals_int (gst_event_get_n_stream_config_headers (event), 2);
-
-    buf = (GstBuffer *) & dummy;
-    gst_event_parse_nth_stream_config_header (event, 1, &buf);
-    fail_unless (buf == sh2);
-    fail_unless (GST_IS_BUFFER (buf));
-
-    buf = (GstBuffer *) & dummy;
-    gst_event_parse_nth_stream_config_header (event, 0, &buf);
-    fail_unless (buf == sh1);
-    fail_unless (GST_IS_BUFFER (buf));
-
-    gst_event_unref (event);
-  }
-
   /* TAGS */
   {
     GstTagList *taglist = gst_tag_list_new_empty ();
@@ -243,8 +216,9 @@ GST_START_TEST (create_events)
     gdouble rate;
     GstFormat format;
     GstSeekFlags flags;
-    GstSeekType cur_type, stop_type;
-    gint64 cur, stop;
+    GstSeekType start_type, stop_type;
+    gint64 start, stop;
+    GstClockTime trickmode_interval;
 
     event = gst_event_new_seek (0.5, GST_FORMAT_BYTES,
         GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE,
@@ -256,19 +230,87 @@ GST_START_TEST (create_events)
     fail_if (GST_EVENT_IS_DOWNSTREAM (event));
     fail_if (GST_EVENT_IS_SERIALIZED (event));
 
-    gst_event_parse_seek (event, &rate, &format, &flags, &cur_type, &cur,
+    gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start,
         &stop_type, &stop);
     fail_unless (rate == 0.5);
     fail_unless (format == GST_FORMAT_BYTES);
     fail_unless (flags == (GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_ACCURATE));
-    fail_unless (cur_type == GST_SEEK_TYPE_SET);
-    fail_unless (cur == 1);
+    fail_unless (start_type == GST_SEEK_TYPE_SET);
+    fail_unless (start == 1);
     fail_unless (stop_type == GST_SEEK_TYPE_NONE);
     fail_unless (stop == 0xdeadbeef);
 
+    gst_event_parse_seek_trickmode_interval (event, &trickmode_interval);
+    fail_unless_equals_uint64 (trickmode_interval, 0);
+
+    gst_event_set_seek_trickmode_interval (event, GST_SECOND);
+    gst_event_parse_seek_trickmode_interval (event, &trickmode_interval);
+    fail_unless_equals_uint64 (trickmode_interval, GST_SECOND);
+
+    gst_event_ref (event);
+    ASSERT_CRITICAL (gst_event_set_seek_trickmode_interval (event,
+            2 * GST_SECOND));
+    gst_event_unref (event);
+
+    gst_event_unref (event);
+
+    event = gst_event_new_flush_start ();
+    ASSERT_CRITICAL (gst_event_set_seek_trickmode_interval (event, GST_SECOND));
+    gst_event_unref (event);
+  }
+
+  /* STREAM_START */
+  {
+    GstStreamFlags flags = ~GST_STREAM_FLAG_NONE;
+
+    event = gst_event_new_stream_start ("7f4b2f0/audio_02");
+    fail_if (event == NULL);
+    fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_STREAM_START);
+    fail_if (GST_EVENT_IS_UPSTREAM (event));
+    fail_unless (GST_EVENT_IS_DOWNSTREAM (event));
+    fail_unless (GST_EVENT_IS_SERIALIZED (event));
+    gst_event_parse_stream_flags (event, &flags);
+    fail_unless_equals_int (flags, GST_STREAM_FLAG_NONE);
+    gst_event_set_stream_flags (event, GST_STREAM_FLAG_SPARSE);
+    gst_event_parse_stream_flags (event, &flags);
+    fail_unless_equals_int (flags, GST_STREAM_FLAG_SPARSE);
+    gst_event_ref (event);
+    ASSERT_CRITICAL (gst_event_set_stream_flags (event, GST_STREAM_FLAG_NONE));
+    gst_event_unref (event);
     gst_event_unref (event);
   }
 
+  /* STREAM_COLLECTION */
+  {
+    GstStreamCollection *collection, *res = NULL;
+    GstStream *stream1, *stream2;
+    GstCaps *caps1, *caps2;
+
+    /* Create a collection of two streams */
+    caps1 = gst_caps_from_string ("some/caps");
+    caps2 = gst_caps_from_string ("some/other-string");
+
+    stream1 = gst_stream_new ("stream-1", caps1, GST_STREAM_TYPE_AUDIO, 0);
+    stream2 = gst_stream_new ("stream-2", caps2, GST_STREAM_TYPE_VIDEO, 0);
+
+    collection = gst_stream_collection_new ("something");
+    fail_unless (gst_stream_collection_add_stream (collection, stream1));
+    fail_unless (gst_stream_collection_add_stream (collection, stream2));
+
+    event = gst_event_new_stream_collection (collection);
+    fail_unless (event != NULL);
+
+    gst_event_parse_stream_collection (event, &res);
+    fail_unless (res != NULL);
+    fail_unless (res == collection);
+
+    gst_event_unref (event);
+    gst_object_unref (res);
+    gst_object_unref (collection);
+    gst_caps_unref (caps1);
+    gst_caps_unref (caps2);
+  }
+
   /* NAVIGATION */
   {
     structure = gst_structure_new ("application/x-gst-navigation", "event",
@@ -285,6 +327,43 @@ GST_START_TEST (create_events)
     gst_event_unref (event);
   }
 
+  /* Protection */
+  {
+    GstBuffer *data;
+    GstMemory *mem;
+    const gchar *parsed_origin;
+    const gchar *parsed_id;
+    GstBuffer *parsed_data;
+    const gchar clearkey_sys_id[] = "78f32170-d883-11e0-9572-0800200c9a66";
+    gsize offset;
+
+    data = gst_buffer_new ();
+    mem = gst_allocator_alloc (NULL, 40, NULL);
+    gst_buffer_insert_memory (data, -1, mem);
+    for (offset = 0; offset < 40; offset += 4) {
+      gst_buffer_fill (data, offset, "pssi", 4);
+    }
+    ASSERT_MINI_OBJECT_REFCOUNT (data, "data", 1);
+    event = gst_event_new_protection (clearkey_sys_id, data, "test");
+    fail_if (event == NULL);
+    ASSERT_MINI_OBJECT_REFCOUNT (data, "data", 2);
+    fail_unless (GST_EVENT_TYPE (event) == GST_EVENT_PROTECTION);
+    fail_unless (GST_EVENT_IS_DOWNSTREAM (event));
+    fail_unless (GST_EVENT_IS_SERIALIZED (event));
+    gst_event_parse_protection (event, &parsed_id, &parsed_data,
+        &parsed_origin);
+    fail_if (parsed_id == NULL);
+    fail_unless (g_strcmp0 (clearkey_sys_id, parsed_id) == 0);
+    fail_if (parsed_data == NULL);
+    fail_if (parsed_data != data);
+    ASSERT_MINI_OBJECT_REFCOUNT (data, "data", 2);
+    fail_if (parsed_origin == NULL);
+    fail_unless (g_strcmp0 ("test", parsed_origin) == 0);
+    gst_event_unref (event);
+    ASSERT_MINI_OBJECT_REFCOUNT (data, "data", 1);
+    gst_buffer_unref (data);
+  }
+
   /* Custom event types */
   {
     structure = gst_structure_new_empty ("application/x-custom");
@@ -405,8 +484,8 @@ event_probe (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
 
 typedef struct
 {
-  GMutex *lock;
-  GCond *cond;
+  GMutex lock;
+  GCond cond;
   gboolean signaled;
 } SignalData;
 
@@ -414,8 +493,8 @@ static void
 signal_data_init (SignalData * data)
 {
   GST_DEBUG ("init %p", data);
-  data->lock = g_mutex_new ();
-  data->cond = g_cond_new ();
+  g_mutex_init (&data->lock);
+  g_cond_init (&data->cond);
   data->signaled = FALSE;
 }
 
@@ -423,29 +502,29 @@ static void
 signal_data_cleanup (SignalData * data)
 {
   GST_DEBUG ("free %p", data);
-  g_mutex_free (data->lock);
-  g_cond_free (data->cond);
+  g_mutex_clear (&data->lock);
+  g_cond_clear (&data->cond);
 }
 
 static void
 signal_data_signal (SignalData * data)
 {
-  g_mutex_lock (data->lock);
+  g_mutex_lock (&data->lock);
   data->signaled = TRUE;
-  g_cond_broadcast (data->cond);
+  g_cond_broadcast (&data->cond);
   GST_DEBUG ("signaling %p", data);
-  g_mutex_unlock (data->lock);
+  g_mutex_unlock (&data->lock);
 }
 
 static void
 signal_data_wait (SignalData * data)
 {
-  g_mutex_lock (data->lock);
+  g_mutex_lock (&data->lock);
   GST_DEBUG ("signal wait %p", data);
   while (!data->signaled)
-    g_cond_wait (data->cond, data->lock);
+    g_cond_wait (&data->cond, &data->lock);
   GST_DEBUG ("signal wait done %p", data);
-  g_mutex_unlock (data->lock);
+  g_mutex_unlock (&data->lock);
 }
 
 static GstPadProbeReturn