We are currently experiencing downtime impacting viewing & cloning the Mesa repo, and some GitLab pages returning 503. Please see #freedesktop on IRC for more updates.

gstevent.c 17.5 KB
Newer Older
1 2 3 4
/* GStreamer
 * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
 *                    2000 Wim Taymans <wim.taymans@chello.be>
 *
5
 * gstevent.c: GstEvent subsystem
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 *
 * 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.
 */
22 23 24 25 26 27 28 29 30 31 32 33
/**
 * SECTION:gstevent
 * @short_description: Structure describing events that are passed up and down a pipeline
 * @see_also: #GstPad, #GstElement
 *
 * The event classes are used to construct and query events.
 *
 * Events are usually created with gst_event_new() which takes the event type as
 * an argument. Properties specific to the event can be set afterwards with the
 * provided macros. The event should be unreferenced with gst_event_unref().
 *
 * gst_event_new_seek() is a usually used to create a seek event and it takes
34
 * the needed parameters for a seek event.
35 36 37
 *
 * gst_event_new_flush() creates a new flush event.
 */
38

39
#include <string.h>             /* memcpy */
40

41 42 43
#include "gst_private.h"

#include "gstinfo.h"
44
#include "gstevent.h"
Wim Taymans's avatar
Wim Taymans committed
45
#include "gstenumtypes.h"
46
#include "gstutils.h"
Benjamin Otte's avatar
Benjamin Otte committed
47

48 49 50 51
static void gst_event_init (GTypeInstance * instance, gpointer g_class);
static void gst_event_class_init (gpointer g_class, gpointer class_data);
static void gst_event_finalize (GstEvent * event);
static GstEvent *_gst_event_copy (GstEvent * event);
52 53 54 55

void
_gst_event_initialize (void)
{
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
  gst_event_get_type ();
}

GType
gst_event_get_type (void)
{
  static GType _gst_event_type;

  if (G_UNLIKELY (_gst_event_type == 0)) {
    static const GTypeInfo event_info = {
      sizeof (GstEventClass),
      NULL,
      NULL,
      gst_event_class_init,
      NULL,
      NULL,
      sizeof (GstEvent),
      0,
      gst_event_init,
      NULL
    };

    _gst_event_type = g_type_register_static (GST_TYPE_MINI_OBJECT,
        "GstEvent", &event_info, 0);
  }
81

82
  return _gst_event_type;
83 84
}

85 86
static void
gst_event_class_init (gpointer g_class, gpointer class_data)
Wim Taymans's avatar
Wim Taymans committed
87
{
88
  GstEventClass *event_class = GST_EVENT_CLASS (g_class);
Wim Taymans's avatar
Wim Taymans committed
89

90 91 92 93 94
  event_class->mini_object_class.copy =
      (GstMiniObjectCopyFunction) _gst_event_copy;
  event_class->mini_object_class.finalize =
      (GstMiniObjectFinalizeFunction) gst_event_finalize;
}
Wim Taymans's avatar
Wim Taymans committed
95

96 97 98 99
static void
gst_event_init (GTypeInstance * instance, gpointer g_class)
{
  GstEvent *event;
100

101
  event = GST_EVENT (instance);
Wim Taymans's avatar
Wim Taymans committed
102

103
  GST_EVENT_TIMESTAMP (event) = GST_CLOCK_TIME_NONE;
Wim Taymans's avatar
Wim Taymans committed
104 105
}

106
static void
107
gst_event_finalize (GstEvent * event)
108
{
109 110 111
  g_return_if_fail (event != NULL);
  g_return_if_fail (GST_IS_EVENT (event));

112
  GST_CAT_INFO (GST_CAT_EVENT, "freeing event %p", event);
Wim Taymans's avatar
Wim Taymans committed
113

114 115
  if (GST_EVENT_SRC (event)) {
    gst_object_unref (GST_EVENT_SRC (event));
116
    GST_EVENT_SRC (event) = NULL;
117
  }
Wim Taymans's avatar
Wim Taymans committed
118 119 120
  if (event->structure) {
    gst_structure_set_parent_refcount (event->structure, NULL);
    gst_structure_free (event->structure);
121
  }
122 123 124 125 126 127 128
}

static GstEvent *
_gst_event_copy (GstEvent * event)
{
  GstEvent *copy;

Wim Taymans's avatar
Wim Taymans committed
129
  copy = (GstEvent *) gst_mini_object_new (GST_TYPE_EVENT);
130

Wim Taymans's avatar
Wim Taymans committed
131 132
  GST_EVENT_TYPE (copy) = GST_EVENT_TYPE (event);
  GST_EVENT_TIMESTAMP (copy) = GST_EVENT_TIMESTAMP (event);
133

Wim Taymans's avatar
Wim Taymans committed
134 135 136 137 138 139 140
  if (GST_EVENT_SRC (event)) {
    GST_EVENT_SRC (copy) = gst_object_ref (GST_EVENT_SRC (event));
  }
  if (event->structure) {
    copy->structure = gst_structure_copy (event->structure);
    gst_structure_set_parent_refcount (copy->structure,
        &event->mini_object.refcount);
141 142
  }
  return copy;
143 144
}

Wim Taymans's avatar
Wim Taymans committed
145 146
static GstEvent *
gst_event_new (GstEventType type)
147
{
Wim Taymans's avatar
Wim Taymans committed
148
  GstEvent *event;
149

Wim Taymans's avatar
Wim Taymans committed
150
  event = (GstEvent *) gst_mini_object_new (GST_TYPE_EVENT);
151

Wim Taymans's avatar
Wim Taymans committed
152
  GST_CAT_INFO (GST_CAT_EVENT, "creating new event %p %d", event, type);
153

Wim Taymans's avatar
Wim Taymans committed
154 155 156
  event->type = type;
  event->src = NULL;
  event->structure = NULL;
157

Wim Taymans's avatar
Wim Taymans committed
158
  return event;
159 160
}

161
/**
Wim Taymans's avatar
Wim Taymans committed
162
 * gst_event_new_custom:
163
 * @type: The type of the new event
Wim Taymans's avatar
Wim Taymans committed
164 165
 * @structure: The structure for the event. The event will take ownership of
 * the structure.
166
 *
Wim Taymans's avatar
Wim Taymans committed
167 168 169
 * Create a new custom-typed event. This can be used for anything not
 * handled by other event-specific functions to pass an event to another
 * element.
170
 *
Wim Taymans's avatar
Wim Taymans committed
171 172 173 174 175 176 177 178
 * Make sure to allocate an event type with the #GST_EVENT_MAKE_TYPE macro,
 * assigning a free number and filling in the correct direction and
 * serialization flags.
 *
 * New custom events can also be created by subclassing the event type if
 * needed.
 *
 * Returns: The new custom event.
179
 */
180
GstEvent *
Wim Taymans's avatar
Wim Taymans committed
181
gst_event_new_custom (GstEventType type, GstStructure * structure)
182 183 184
{
  GstEvent *event;

Wim Taymans's avatar
Wim Taymans committed
185 186 187 188 189
  event = gst_event_new (type);
  if (structure) {
    gst_structure_set_parent_refcount (structure, &event->mini_object.refcount);
    event->structure = structure;
  }
190
  return event;
191 192
}

193
/**
Wim Taymans's avatar
Wim Taymans committed
194 195
 * gst_event_get_structure:
 * @event: The #GstEvent.
196
 *
Wim Taymans's avatar
Wim Taymans committed
197
 * Access the structure of the event.
198
 *
Wim Taymans's avatar
Wim Taymans committed
199 200 201 202 203
 * Returns: The structure of the event. The structure is still
 * owned by the event, which means that you should not free it and
 * that the pointer becomes invalid when you free the event.
 *
 * MT safe.
204
 */
Wim Taymans's avatar
Wim Taymans committed
205 206
const GstStructure *
gst_event_get_structure (GstEvent * event)
207
{
Wim Taymans's avatar
Wim Taymans committed
208
  g_return_val_if_fail (GST_IS_EVENT (event), NULL);
209

Wim Taymans's avatar
Wim Taymans committed
210
  return event->structure;
211
}
212

Wim Taymans's avatar
Wim Taymans committed
213
/**
Wim Taymans's avatar
Wim Taymans committed
214 215 216 217 218 219 220 221
 * gst_event_new_flush_start:
 *
 * Allocate a new flush start event. The flush start event can be send
 * upstream and downstream and travels out-of-bounds with the dataflow.
 * It marks pads as being in a WRONG_STATE to process more data.
 *
 * Elements unlock and blocking functions and exit their streaming functions
 * as fast as possible. 
Wim Taymans's avatar
Wim Taymans committed
222
 *
Wim Taymans's avatar
Wim Taymans committed
223 224
 * This event is typically generated after a seek to minimize the latency
 * after the seek.
Wim Taymans's avatar
Wim Taymans committed
225
 *
Wim Taymans's avatar
Wim Taymans committed
226
 * Returns: A new flush start event.
Wim Taymans's avatar
Wim Taymans committed
227
 */
228
GstEvent *
Wim Taymans's avatar
Wim Taymans committed
229
gst_event_new_flush_start (void)
230
{
Wim Taymans's avatar
Wim Taymans committed
231
  return gst_event_new (GST_EVENT_FLUSH_START);
232 233
}

234
/**
Wim Taymans's avatar
Wim Taymans committed
235 236 237 238 239 240
 * gst_event_new_flush_stop:
 *
 * Allocate a new flush stop event. The flush start event can be send
 * upstream and downstream and travels out-of-bounds with the dataflow.
 * It is typically send after sending a FLUSH_START event to make the
 * pads accept data again.
241
 *
Wim Taymans's avatar
Wim Taymans committed
242 243
 * Elements can process this event synchronized with the dataflow since
 * the preceeding FLUSH_START event stopped the dataflow.
244
 *
Wim Taymans's avatar
Wim Taymans committed
245 246 247 248
 * This event is typically generated to complete a seek and to resume
 * dataflow.
 *
 * Returns: A new flush stop event.
249
 */
250
GstEvent *
Wim Taymans's avatar
Wim Taymans committed
251
gst_event_new_flush_stop (void)
252
{
Wim Taymans's avatar
Wim Taymans committed
253
  return gst_event_new (GST_EVENT_FLUSH_STOP);
254 255
}

Wim Taymans's avatar
Wim Taymans committed
256
/**
Wim Taymans's avatar
Wim Taymans committed
257
 * gst_event_new_eos:
Wim Taymans's avatar
Wim Taymans committed
258
 *
Wim Taymans's avatar
Wim Taymans committed
259 260 261 262
 * Create a new EOS event. The eos event can only travel downstream
 * synchronized with the buffer flow. Elements that receive the EOS
 * event on a pad can return UNEXPECTED as a GstFlowReturn when data
 * after the EOS event arrives.
Wim Taymans's avatar
Wim Taymans committed
263
 *
Wim Taymans's avatar
Wim Taymans committed
264 265 266 267 268 269 270
 * The EOS event will travel up to the sink elements in the pipeline
 * which will then post the GST_MESSAGE_EOS on the bus.
 *
 * When all sinks have posted an EOS message, the EOS message is
 * forwarded to the application.
 *
 * Returns: The new EOS event.
Wim Taymans's avatar
Wim Taymans committed
271
 */
Wim Taymans's avatar
Wim Taymans committed
272 273
GstEvent *
gst_event_new_eos (void)
274
{
Wim Taymans's avatar
Wim Taymans committed
275
  return gst_event_new (GST_EVENT_EOS);
276 277
}

278
/**
Wim Taymans's avatar
Wim Taymans committed
279 280 281
 * gst_event_new_newsegment:
 * @rate: a new rate for playback
 * @format: The format of the segment values
282 283
 * @start_value: the start value of the segment
 * @stop_value: the stop value of the segment
Wim Taymans's avatar
Wim Taymans committed
284 285 286 287 288 289
 * @base: base value for buffer timestamps.
 *
 * Allocate a new newsegment event with the given format/values tripplets.
 *
 * The newsegment event marks the range of buffers to be processed. All
 * data not within the segment range is not to be processed.
290
 *
Wim Taymans's avatar
Wim Taymans committed
291 292
 * The base time of the segment is used to convert the buffer timestamps
 * into the stream time again.
293
 *
Wim Taymans's avatar
Wim Taymans committed
294 295 296 297 298
 * After a newsegment event, the buffer stream time is calculated with:
 *
 *   TIMESTAMP(buf) - start_time + base
 *
 * Returns: A new newsegment event.
299
 */
300
GstEvent *
Wim Taymans's avatar
Wim Taymans committed
301
gst_event_new_newsegment (gdouble rate, GstFormat format,
302
    gint64 start_value, gint64 stop_value, gint64 base)
303
{
304 305 306 307 308
  if (format == GST_FORMAT_TIME) {
    GST_CAT_INFO (GST_CAT_EVENT,
        "creating newsegment rate %lf, format GST_FORMAT_TIME, "
        "start %" GST_TIME_FORMAT ", stop %" GST_TIME_FORMAT
        ", base %" GST_TIME_FORMAT,
309 310
        rate, GST_TIME_ARGS (start_value),
        GST_TIME_ARGS (stop_value), GST_TIME_ARGS (base));
311 312 313 314
  } else {
    GST_CAT_INFO (GST_CAT_EVENT,
        "creating newsegment rate %lf, format %d, "
        "start %lld, stop %lld, base %lld",
315
        rate, format, start_value, stop_value, base);
316 317
  }

318 319
  if (start_value != -1 && stop_value != -1)
    g_return_val_if_fail (start_value < stop_value, NULL);
320

Wim Taymans's avatar
Wim Taymans committed
321 322 323
  return gst_event_new_custom (GST_EVENT_NEWSEGMENT,
      gst_structure_new ("GstEventNewsegment", "rate", G_TYPE_DOUBLE, rate,
          "format", GST_TYPE_FORMAT, format,
324 325
          "start_val", G_TYPE_INT64, start_value,
          "stop_val", G_TYPE_INT64, stop_value,
Wim Taymans's avatar
Wim Taymans committed
326 327
          "base", G_TYPE_INT64, base, NULL));
}
328

Wim Taymans's avatar
Wim Taymans committed
329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345
/**
 * gst_event_parse_newsegment:
 * @event: The event to query
 * @rate: A pointer to the rate of the segment
 * @format: A pointer to the format of the newsegment values
 * @start_value: A pointer to store the start value in
 * @stop_value: A pointer to store the stop value in
 * @base: A pointer to store the base time in
 *
 * Get the start, stop and format in the newsegment event.
 */
void
gst_event_parse_newsegment (GstEvent * event, gdouble * rate,
    GstFormat * format, gint64 * start_value, gint64 * stop_value,
    gint64 * base)
{
  const GstStructure *structure;
346

Wim Taymans's avatar
Wim Taymans committed
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
  g_return_if_fail (GST_IS_EVENT (event));
  g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_NEWSEGMENT);

  structure = gst_event_get_structure (event);
  if (rate)
    *rate = g_value_get_double (gst_structure_get_value (structure, "rate"));
  if (format)
    *format = g_value_get_enum (gst_structure_get_value (structure, "format"));
  if (start_value)
    *start_value =
        g_value_get_int64 (gst_structure_get_value (structure, "start_val"));
  if (stop_value)
    *stop_value =
        g_value_get_int64 (gst_structure_get_value (structure, "stop_val"));
  if (base)
    *base = g_value_get_int64 (gst_structure_get_value (structure, "base"));
}
364

365 366 367 368 369 370 371 372
/**
 * gst_event_new_tag:
 * @taglist: metadata list
 *
 * Generates a metadata tag event from the given @taglist.
 * 
 * Returns: a new #GstEvent
 */
Wim Taymans's avatar
Wim Taymans committed
373 374 375 376 377 378
GstEvent *
gst_event_new_tag (GstTagList * taglist)
{
  g_return_val_if_fail (taglist != NULL, NULL);

  return gst_event_new_custom (GST_EVENT_TAG, (GstStructure *) taglist);
379 380
}

381 382 383 384 385 386 387
/**
 * gst_event_parse_tag:
 * @event: a tag event
 * @taglist: pointer to metadata list
 *
 * Parses a tag @event and stores the results in the given @taglist location.
 */
Wim Taymans's avatar
Wim Taymans committed
388 389 390 391 392 393 394 395 396 397 398
void
gst_event_parse_tag (GstEvent * event, GstTagList ** taglist)
{
  g_return_if_fail (GST_IS_EVENT (event));
  g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_TAG);

  if (taglist)
    *taglist = (GstTagList *) event->structure;
}

/* filler event */
399 400 401 402 403 404 405
/**
 * gst_event_new_filler:
 *
 * Create a new dummy event that should be ignored.
 *
 * Returns: a new #GstEvent
 */
Wim Taymans's avatar
Wim Taymans committed
406 407 408 409 410
GstEvent *
gst_event_new_filler (void)
{
  return gst_event_new (GST_EVENT_FILLER);
}
411

412
/**
Wim Taymans's avatar
Wim Taymans committed
413 414 415 416 417 418 419 420 421 422 423 424 425
 * gst_event_new_qos:
 * @proportion: the proportion of the qos message
 * @diff: The time difference of the last Clock sync
 * @timestamp: The timestamp of the buffer
 *
 * Allocate a new qos event with the given values.
 * The QOS event is generated in an element that wants an upstream
 * element to either reduce or increase its rate because of
 * high/low CPU load.
 *
 * proportion is the requested adjustment in datarate, 1.0 is the normal
 * datarate, 0.75 means increase datarate by 75%, 1.5 is 150%. Negative
 * values request a slow down, so -0.75 means a decrease by 75%.
426
 *
Wim Taymans's avatar
Wim Taymans committed
427 428
 * diff is the difference against the clock in stream time of the last 
 * buffer that caused the element to generate the QOS event.
429
 *
Wim Taymans's avatar
Wim Taymans committed
430 431 432 433
 * timestamp is the timestamp of the last buffer that cause the element
 * to generate the QOS event.
 *
 * Returns: A new QOS event.
434
 */
435
GstEvent *
Wim Taymans's avatar
Wim Taymans committed
436 437
gst_event_new_qos (gdouble proportion, GstClockTimeDiff diff,
    GstClockTime timestamp)
438
{
439 440 441 442 443
  GST_CAT_INFO (GST_CAT_EVENT,
      "creating qos proportion %lf, diff %" GST_TIME_FORMAT
      ", timestamp %" GST_TIME_FORMAT, proportion,
      GST_TIME_ARGS (diff), GST_TIME_ARGS (timestamp));

Wim Taymans's avatar
Wim Taymans committed
444 445 446 447 448 449
  return gst_event_new_custom (GST_EVENT_QOS,
      gst_structure_new ("GstEventQOS",
          "proportion", G_TYPE_DOUBLE, proportion,
          "diff", G_TYPE_INT64, diff,
          "timestamp", G_TYPE_UINT64, timestamp, NULL));
}
450

Wim Taymans's avatar
Wim Taymans committed
451 452 453 454 455 456 457 458 459 460 461 462 463 464
/**
 * gst_event_parse_qos:
 * @event: The event to query
 * @proportion: A pointer to store the proportion in
 * @diff: A pointer to store the diff in
 * @timestamp: A pointer to store the timestamp in
 *
 * Get the proportion, diff and timestamp in the qos event.
 */
void
gst_event_parse_qos (GstEvent * event, gdouble * proportion,
    GstClockTimeDiff * diff, GstClockTime * timestamp)
{
  const GstStructure *structure;
465

Wim Taymans's avatar
Wim Taymans committed
466 467 468 469 470 471 472 473 474 475 476 477
  g_return_if_fail (GST_IS_EVENT (event));
  g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_QOS);

  structure = gst_event_get_structure (event);
  if (proportion)
    *proportion =
        g_value_get_double (gst_structure_get_value (structure, "proportion"));
  if (diff)
    *diff = g_value_get_int64 (gst_structure_get_value (structure, "diff"));
  if (timestamp)
    *timestamp =
        g_value_get_uint64 (gst_structure_get_value (structure, "timestamp"));
478
}
479 480

/**
Wim Taymans's avatar
Wim Taymans committed
481 482 483 484 485 486 487 488 489 490 491
 * gst_event_new_seek:
 * @rate: The new playback rate
 * @format: The format of the seek values
 * @flags: The optional seek flags.
 * @cur_type: The type and flags for the new current position
 * @cur: The value of the new current position
 * @stop_type: The type and flags for the new stop position
 * @stop: The value of the new stop position
 *
 * Allocate a new seek event with the given parameters.
 *
492
 * The seek event configures playback of the pipeline from
Wim Taymans's avatar
Wim Taymans committed
493 494
 * @cur to @stop at the speed given in @rate.
 * The @cur and @stop values are expressed in format @format.
495
 *
Wim Taymans's avatar
Wim Taymans committed
496 497 498
 * A @rate of 1.0 means normal playback rate, 2.0 means double speed.
 * Negatives values means backwards playback. A value of 0.0 for the
 * rate is not allowed.
499
 *
Wim Taymans's avatar
Wim Taymans committed
500 501 502 503 504
 * @cur_type and @stop_type specify how to adjust the current and stop
 * time, relative or absolute. A type of #GST_EVENT_TYPE_NONE means that
 * the position should not be updated.
 *
 * Returns: A new seek event.
505 506
 */
GstEvent *
Wim Taymans's avatar
Wim Taymans committed
507 508
gst_event_new_seek (gdouble rate, GstFormat format, GstSeekFlags flags,
    GstSeekType cur_type, gint64 cur, GstSeekType stop_type, gint64 stop)
509
{
510 511 512 513 514 515 516 517 518 519 520 521 522 523 524
  if (format == GST_FORMAT_TIME) {
    GST_CAT_INFO (GST_CAT_EVENT,
        "creating seek rate %lf, format TIME, flags %d, "
        "cur_type %d, cur %" GST_TIME_FORMAT ", "
        "stop_type %d, stop %" GST_TIME_FORMAT,
        rate, flags, cur_type, GST_TIME_ARGS (cur),
        stop_type, GST_TIME_ARGS (stop));
  } else {
    GST_CAT_INFO (GST_CAT_EVENT,
        "creating seek rate %lf, format %d, flags %d, "
        "cur_type %d, cur %" G_GINT64_FORMAT ", "
        "stop_type %d, stop %" G_GINT64_FORMAT,
        rate, format, flags, cur_type, cur, stop_type, stop);
  }

Wim Taymans's avatar
Wim Taymans committed
525 526 527 528 529 530 531 532 533
  return gst_event_new_custom (GST_EVENT_SEEK,
      gst_structure_new ("GstEventSeek", "rate", G_TYPE_DOUBLE, rate,
          "format", GST_TYPE_FORMAT, format,
          "flags", GST_TYPE_SEEK_FLAGS, flags,
          "cur_type", GST_TYPE_SEEK_TYPE, cur_type,
          "cur", G_TYPE_INT64, cur,
          "stop_type", GST_TYPE_SEEK_TYPE, stop_type,
          "stop", G_TYPE_INT64, stop, NULL));
}
534

535 536 537 538 539 540 541 542 543 544 545 546 547
/**
 * gst_event_parse_seek:
 * @event: a seek event
 * @rate: result location for the rate
 * @format: result location for the stream format
 * @flags:  result location for the #GstSeekFlags
 * @cur_type: result location for the #GstSeekType of the current position
 * @cur: result location for the current postion expressed in @format
 * @stop_type:  result location for the #GstSeekType of the stop position
 * @stop: result location for the stop postion expressed in @format
 *
 * Parses a seek @event and stores the results in the given result locations.
 */
Wim Taymans's avatar
Wim Taymans committed
548 549 550 551 552 553 554
void
gst_event_parse_seek (GstEvent * event, gdouble * rate, GstFormat * format,
    GstSeekFlags * flags,
    GstSeekType * cur_type, gint64 * cur,
    GstSeekType * stop_type, gint64 * stop)
{
  const GstStructure *structure;
555

Wim Taymans's avatar
Wim Taymans committed
556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577
  g_return_if_fail (GST_IS_EVENT (event));
  g_return_if_fail (GST_EVENT_TYPE (event) == GST_EVENT_SEEK);

  structure = gst_event_get_structure (event);
  if (rate)
    *rate = g_value_get_double (gst_structure_get_value (structure, "rate"));
  if (format)
    *format = g_value_get_enum (gst_structure_get_value (structure, "format"));
  if (flags)
    *flags = g_value_get_flags (gst_structure_get_value (structure, "flags"));
  if (cur_type)
    *cur_type =
        g_value_get_enum (gst_structure_get_value (structure, "cur_type"));
  if (cur)
    *cur = g_value_get_int64 (gst_structure_get_value (structure, "cur"));
  if (stop_type)
    *stop_type =
        g_value_get_enum (gst_structure_get_value (structure, "stop_type"));
  if (stop)
    *stop = g_value_get_int64 (gst_structure_get_value (structure, "stop"));
}

578 579 580 581 582 583 584 585
/**
 * gst_event_new_navigation:
 * @structure: description of the event
 *
 * Create a new navigation event from the given description.
 *
 * Returns: a new #GstEvent
 */
Wim Taymans's avatar
Wim Taymans committed
586 587 588 589 590 591
GstEvent *
gst_event_new_navigation (GstStructure * structure)
{
  g_return_val_if_fail (structure != NULL, NULL);

  return gst_event_new_custom (GST_EVENT_NAVIGATION, structure);
592
}