event: Make SEGMENT event parsing API more consistent with the others
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Wed, 18 May 2011 14:56:13 +0000 (16:56 +0200)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Wed, 18 May 2011 14:56:43 +0000 (16:56 +0200)
19 files changed:
gst/gstevent.c
gst/gstevent.h
libs/gst/base/gstbaseparse.c
libs/gst/base/gstbasesink.c
libs/gst/base/gstbasetransform.c
libs/gst/base/gstcollectpads.c
plugins/elements/gstfdsink.c
plugins/elements/gstfilesink.c
plugins/elements/gstfunnel.c
plugins/elements/gstidentity.c
plugins/elements/gstinputselector.c
plugins/elements/gstmultiqueue.c
plugins/elements/gstoutputselector.c
plugins/elements/gstqueue.c
plugins/elements/gstqueue2.c
tests/check/gst/gstevent.c
tests/check/libs/basesrc.c
win32/common/libgstbase.def
win32/common/libgstreamer.def

index ca066a38addf0f78727cfefed8d3450ebf108def..bb861d4b7c05eb015ff6db3626b0cb59d232e3ac 100644 (file)
@@ -632,49 +632,49 @@ gst_event_new_segment (GstSegment * segment)
 }
 
 /**
- * gst_event_get_segment:
- * @event: The event
- *
- * Get the segment from @event. The segment remains valid as long as @event remains
- * valid.
+ * gst_event_parse_segment:
+ * @event: The event to parse
+ * @segment: (out) (transfer none): a pointer to a #GstSegment
  *
- * Returns: the #GstSegment. The segment stays valid for as long as @event is
- * valid.
+ * Parses a segment @event and stores the result in the given @segment location.
+ * @segment remains valid only until the @event is freed. Don't modify the segment
+ * and make a copy if you want to modify it or store it for later use.
  */
-const GstSegment *
-gst_event_get_segment (GstEvent * event)
+void
+gst_event_parse_segment (GstEvent * event, const GstSegment ** segment)
 {
   GstStructure *structure;
-  GstSegment *segment;
-
-  g_return_val_if_fail (GST_IS_EVENT (event), NULL);
-  g_return_val_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT, NULL);
 
-  structure = GST_EVENT_STRUCTURE (event);
-  segment = g_value_get_boxed (gst_structure_id_get_value (structure,
-          GST_QUARK (SEGMENT)));
+  g_return_if_fail (GST_IS_EVENT (event));
+  g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT);
 
-  return segment;
+  if (segment) {
+    structure = GST_EVENT_STRUCTURE (event);
+    *segment = g_value_get_boxed (gst_structure_id_get_value (structure,
+            GST_QUARK (SEGMENT)));
+  }
 }
 
 /**
- * gst_event_parse_segment:
+ * gst_event_copy_segment:
  * @event: The event to parse
- * @segment: a #GstSegment
+ * @segment: a pointer to a #GstSegment
  *
- * Copy the segment values from @event into @segment.
+ * Parses a segment @event and copies the #GstSegment into the location
+ * given by @segment.
  */
 void
-gst_event_parse_segment (GstEvent * event, GstSegment * segment)
+gst_event_copy_segment (GstEvent * event, GstSegment * segment)
 {
   const GstSegment *src;
 
-  g_return_if_fail (segment != NULL);
-
-  src = gst_event_get_segment (event);
-  g_return_if_fail (src != NULL);
+  g_return_if_fail (GST_IS_EVENT (event));
+  g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT);
 
-  gst_segment_copy_into (src, segment);
+  if (segment) {
+    gst_event_parse_segment (event, &src);
+    gst_segment_copy_into (src, segment);
+  }
 }
 
 /**
index 0019b38f00463b637d2e10c468ef8946ad9d979d..46bac885f03d682fb53ef4ce781d13476c7cba8b 100644 (file)
@@ -410,9 +410,8 @@ void            gst_event_parse_caps            (GstEvent *event, GstCaps **caps
 
 /* segment event */
 GstEvent*       gst_event_new_segment           (GstSegment *segment);
-const GstSegment *
-                gst_event_get_segment           (GstEvent *event);
-void            gst_event_parse_segment         (GstEvent *event, GstSegment *segment);
+void            gst_event_parse_segment         (GstEvent *event, const GstSegment **segment);
+void            gst_event_copy_segment          (GstEvent *event, GstSegment *segment);
 
 /* tag event */
 GstEvent*       gst_event_new_tag               (GstTagList *taglist);
index c07a9018f50eb7cf5d27d015e8d14992fb59831f..15a0b06f4cfe74ee8a78132a7d95274ec1de57d0 100644 (file)
@@ -926,7 +926,7 @@ gst_base_parse_sink_eventfunc (GstBaseParse * parse, GstEvent * event)
       gboolean update;
 #endif
 
-      in_segment = gst_event_get_segment (event);
+      gst_event_parse_segment (event, &in_segment);
       gst_segment_init (&out_segment, GST_FORMAT_TIME);
 
       GST_DEBUG_OBJECT (parse, "segment %" GST_SEGMENT_FORMAT, in_segment);
index f5472d49d65aa686b62324922156ffe66f7e76fa..8d17c2c37a013ac75f6a796ad8322fa3ecefdbd8 100644 (file)
@@ -1454,7 +1454,7 @@ gst_base_sink_configure_segment (GstBaseSink * basesink, GstPad * pad,
   GST_OBJECT_LOCK (basesink);
   /* the newsegment event is needed to bring the buffer timestamps to the
    * stream time and to drop samples outside of the playback segment. */
-  gst_event_parse_segment (event, segment);
+  gst_event_copy_segment (event, segment);
   GST_DEBUG_OBJECT (basesink, "configured SEGMENT %" GST_SEGMENT_FORMAT,
       segment);
   GST_OBJECT_UNLOCK (basesink);
index e76d79eac541494fd77876540fc33f4613ae2e7e..1f45cb625beac90b417bc1a43892fcab1714de5a 100644 (file)
@@ -1583,7 +1583,7 @@ gst_base_transform_sink_eventfunc (GstBaseTransform * trans, GstEvent * event)
     }
     case GST_EVENT_SEGMENT:
     {
-      gst_event_parse_segment (event, &trans->segment);
+      gst_event_copy_segment (event, &trans->segment);
       trans->have_segment = TRUE;
 
       GST_DEBUG_OBJECT (trans, "received SEGMENT %" GST_SEGMENT_FORMAT,
index a218de849e84d42e320eac402e28af566a69be2f..fccb52c9f2937c76b665d058e3b0c54e4a3c30b0 100644 (file)
@@ -1200,7 +1200,7 @@ gst_collect_pads_event (GstPad * pad, GstEvent * event)
     }
     case GST_EVENT_SEGMENT:
     {
-      gst_event_parse_segment (event, &data->segment);
+      gst_event_copy_segment (event, &data->segment);
 
       GST_DEBUG_OBJECT (data->pad, "got newsegment %" GST_SEGMENT_FORMAT,
           &data->segment);
index f5d3584fa6aacc4b06801b95414fc139668bb3c7..b0109295fd78f534ff5307ecdd50063bc04ddddf 100644 (file)
@@ -540,25 +540,25 @@ gst_fd_sink_event (GstBaseSink * sink, GstEvent * event)
   switch (type) {
     case GST_EVENT_SEGMENT:
     {
-      GstSegment segment;
+      const GstSegment *segment;
 
       gst_event_parse_segment (event, &segment);
 
-      if (segment.format == GST_FORMAT_BYTES) {
+      if (segment->format == GST_FORMAT_BYTES) {
         /* only try to seek and fail when we are going to a different
          * position */
-        if (fdsink->current_pos != segment.start) {
+        if (fdsink->current_pos != segment->start) {
           /* FIXME, the seek should be performed on the pos field, start/stop are
            * just boundaries for valid bytes offsets. We should also fill the file
            * with zeroes if the new position extends the current EOF (sparse streams
            * and segment accumulation). */
-          if (!gst_fd_sink_do_seek (fdsink, (guint64) segment.start))
+          if (!gst_fd_sink_do_seek (fdsink, (guint64) segment->start))
             goto seek_failed;
         }
       } else {
         GST_DEBUG_OBJECT (fdsink,
-            "Ignored SEGMENT event of format %u (%s)", (guint) segment.format,
-            gst_format_get_name (segment.format));
+            "Ignored SEGMENT event of format %u (%s)", (guint) segment->format,
+            gst_format_get_name (segment->format));
       }
       break;
     }
index af31b2556e9e5a2fa3a418332d4f1025f265a375..98ba6e24054ed2f1d550db3120835185fe4db881 100644 (file)
@@ -543,27 +543,27 @@ gst_file_sink_event (GstBaseSink * sink, GstEvent * event)
   switch (type) {
     case GST_EVENT_SEGMENT:
     {
-      GstSegment segment;
+      const GstSegment *segment;
 
       gst_event_parse_segment (event, &segment);
 
-      if (segment.format == GST_FORMAT_BYTES) {
+      if (segment->format == GST_FORMAT_BYTES) {
         /* only try to seek and fail when we are going to a different
          * position */
-        if (filesink->current_pos != segment.start) {
+        if (filesink->current_pos != segment->start) {
           /* FIXME, the seek should be performed on the pos field, start/stop are
            * just boundaries for valid bytes offsets. We should also fill the file
            * with zeroes if the new position extends the current EOF (sparse streams
            * and segment accumulation). */
-          if (!gst_file_sink_do_seek (filesink, (guint64) segment.start))
+          if (!gst_file_sink_do_seek (filesink, (guint64) segment->start))
             goto seek_failed;
         } else {
           GST_DEBUG_OBJECT (filesink, "Ignored SEGMENT, no seek needed");
         }
       } else {
         GST_DEBUG_OBJECT (filesink,
-            "Ignored SEGMENT event of format %u (%s)", (guint) segment.format,
-            gst_format_get_name (segment.format));
+            "Ignored SEGMENT event of format %u (%s)", (guint) segment->format,
+            gst_format_get_name (segment->format));
       }
       break;
     }
index 6aa9eed758203e79463057ea7a6084bec6ede44b..5b37e72f6d6d5a32024d048ce71a45a301504778 100644 (file)
@@ -315,7 +315,7 @@ gst_funnel_sink_event (GstPad * pad, GstEvent * event)
     case GST_EVENT_SEGMENT:
     {
       GST_OBJECT_LOCK (funnel);
-      gst_event_parse_segment (event, &fpad->segment);
+      gst_event_copy_segment (event, &fpad->segment);
       GST_OBJECT_UNLOCK (funnel);
 
       forward = FALSE;
index 00e3a6b08d2d039835eec44e7961fb9ccab8b0f0..c06f384292c7fb9ce5faa4dbe5755d0185f6c607 100644 (file)
@@ -353,7 +353,7 @@ gst_identity_event (GstBaseTransform * trans, GstEvent * event)
       GstEvent *news;
       GstSegment segment;
 
-      gst_event_parse_segment (event, &segment);
+      gst_event_copy_segment (event, &segment);
 
       /* This is the first segment, send out a (0, -1) segment */
       gst_segment_init (&segment, segment.format);
index 4ab10453d42c418a6267f9e2715b110b44395c6b..585022e046e24e772e0836a3b81ed7158d5bb492 100644 (file)
@@ -400,7 +400,7 @@ gst_selector_pad_event (GstPad * pad, GstEvent * event)
     {
       GST_INPUT_SELECTOR_LOCK (sel);
       GST_OBJECT_LOCK (selpad);
-      gst_event_parse_segment (event, &selpad->segment);
+      gst_event_copy_segment (event, &selpad->segment);
       GST_DEBUG_OBJECT (pad, "configured SEGMENT %" GST_SEGMENT_FORMAT,
           &selpad->segment);
       GST_OBJECT_UNLOCK (selpad);
index fae88c9ac52fed8e0f1e5bf26922868a14cff301..0fc16c1d7a8d51b06fa15131b09c6e291a7741f8 100644 (file)
@@ -910,7 +910,7 @@ static void
 apply_segment (GstMultiQueue * mq, GstSingleQueue * sq, GstEvent * event,
     GstSegment * segment)
 {
-  gst_event_parse_segment (event, segment);
+  gst_event_copy_segment (event, segment);
 
   /* now configure the values, we use these to track timestamps on the
    * sinkpad. */
@@ -1011,13 +1011,13 @@ get_running_time (GstSegment * segment, GstMiniObject * object, gboolean end)
 
     /* For newsegment events return the running time of the start position */
     if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
-      GstSegment new_segment = *segment;
+      const GstSegment *new_segment;
 
       gst_event_parse_segment (event, &new_segment);
-      if (new_segment.format == GST_FORMAT_TIME) {
+      if (new_segment->format == GST_FORMAT_TIME) {
         time =
-            gst_segment_to_running_time (&new_segment, GST_FORMAT_TIME,
-            new_segment.start);
+            gst_segment_to_running_time (new_segment, GST_FORMAT_TIME,
+            new_segment->start);
       }
     }
   }
index 7d22f9d826f5c3841ff948948ec671db6322c4ac..56f0f6921b60f416dcec5f4dc27dd46caee70902 100644 (file)
@@ -546,7 +546,7 @@ gst_output_selector_handle_sink_event (GstPad * pad, GstEvent * event)
   switch (GST_EVENT_TYPE (event)) {
     case GST_EVENT_SEGMENT:
     {
-      gst_event_parse_segment (event, &sel->segment);
+      gst_event_copy_segment (event, &sel->segment);
 
       GST_DEBUG_OBJECT (sel, "configured SEGMENT update %" GST_SEGMENT_FORMAT,
           &sel->segment);
index 7dc81395b060df36c3c17916fbd084ece6327d02..feeaf5402ef8dde55b6badce164d26c223002f0b 100644 (file)
@@ -570,7 +570,7 @@ static void
 apply_segment (GstQueue * queue, GstEvent * event, GstSegment * segment,
     gboolean sink)
 {
-  gst_event_parse_segment (event, segment);
+  gst_event_copy_segment (event, segment);
 
   /* now configure the values, we use these to track timestamps on the
    * sinkpad. */
index 9ff1719e3f1fd24125f5907dd933cf3afc342981..65f3613f667216eff69f154ddbb6586cadf565f7 100644 (file)
@@ -686,7 +686,7 @@ static void
 apply_segment (GstQueue2 * queue, GstEvent * event, GstSegment * segment,
     gboolean is_sink)
 {
-  gst_event_parse_segment (event, segment);
+  gst_event_copy_segment (event, segment);
 
   if (segment->format == GST_FORMAT_BYTES) {
     if (QUEUE_IS_USING_TEMP_FILE (queue)) {
index ac09c288bb5cbee4e471956252623badbfa588d5..4579317a601eb142b89a098c25716a74db88b864 100644 (file)
@@ -75,7 +75,7 @@ GST_START_TEST (create_events)
     fail_unless (GST_EVENT_IS_DOWNSTREAM (event));
     fail_unless (GST_EVENT_IS_SERIALIZED (event));
 
-    gst_event_parse_segment (event, &parsed);
+    gst_event_copy_segment (event, &parsed);
     fail_unless (parsed.rate == 0.5);
     fail_unless (parsed.applied_rate == 1.0);
     fail_unless (parsed.format == GST_FORMAT_TIME);
index a6aa1e868d1c3697d4b8b38757b913e470e70201..750d9babbf8d401b1b077a95df47bb8539fd807e 100644 (file)
@@ -514,7 +514,7 @@ GST_START_TEST (basesrc_seek_events_rate_update)
   GstEvent *seg_event = NULL;
   GstEvent *rate_seek;
   gboolean event_ret;
-  GstSegment segment;
+  const GstSegment *segment;
 
   pipe = gst_pipeline_new ("pipeline");
   sink = gst_element_factory_make ("fakesink", "sink");
@@ -581,7 +581,7 @@ GST_START_TEST (basesrc_seek_events_rate_update)
   fail_unless (seg_event != NULL);
 
   gst_event_parse_segment (seg_event, &segment);
-  fail_unless (segment.rate == 0.5);
+  fail_unless (segment->rate == 0.5);
 
   gst_pad_remove_event_probe (probe_pad, probe);
   gst_object_unref (probe_pad);
index 2b5992689a761472547c094b751f33b71a7fdf7d..5599490598fce218dafbd84446cef2d2a9e657d5 100644 (file)
@@ -27,6 +27,7 @@ EXPORTS
        gst_base_parse_set_duration
        gst_base_parse_set_frame_rate
        gst_base_parse_set_has_timing_info
+       gst_base_parse_set_latency
        gst_base_parse_set_min_frame_size
        gst_base_parse_set_passthrough
        gst_base_parse_set_syncable
index 6eb71d71e3e25a44c27ffe5fa29e0eb6da9e6fc0..99c247f8ea40cf7abcf72b2a5ec47176a7bef84e 100644 (file)
@@ -381,7 +381,7 @@ EXPORTS
        gst_element_unlink_many
        gst_element_unlink_pads
        gst_error_get_message
-       gst_event_get_segment
+       gst_event_copy_segment
        gst_event_get_seqnum
        gst_event_get_structure
        gst_event_has_name
@@ -667,6 +667,7 @@ EXPORTS
        gst_pad_get_query_types
        gst_pad_get_query_types_default
        gst_pad_get_range
+       gst_pad_get_sticky_event
        gst_pad_get_type
        gst_pad_has_current_caps
        gst_pad_is_active