Test that removing probes from within the probe functions works.
[platform/upstream/gstreamer.git] / gst / gstqueryutils.c
1 /* GStreamer
2  * Copyright (C) 2005 Andy Wingo <wingo@pobox.com>
3  *
4  * gstqueryutils.c: Utility functions for creating and parsing GstQueries.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21
22
23 #include <stdarg.h>
24
25 #include "gstqueryutils.h"
26 #include "gstenumtypes.h"
27 #include "gstvalue.h"
28 #include "gst_private.h"
29
30 /* some macros are just waiting to be defined here */
31
32 void
33 gst_query_parse_seeking_query (GstQuery * query, GstFormat * format)
34 {
35   GstStructure *structure;
36
37   g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SEEKING);
38
39   structure = gst_query_get_structure (query);
40   if (format)
41     *format = g_value_get_enum (gst_structure_get_value (structure, "format"));
42 }
43
44 void
45 gst_query_set_seeking (GstQuery * query, GstFormat format,
46     gboolean seekable, gint64 segment_start, gint64 segment_end)
47 {
48   GstStructure *structure;
49
50   g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SEEKING);
51
52   structure = gst_query_get_structure (query);
53   gst_structure_set (structure,
54       "format", GST_TYPE_FORMAT, format,
55       "seekable", G_TYPE_BOOLEAN, seekable,
56       "segment-start", G_TYPE_INT64, segment_start,
57       "segment-end", G_TYPE_INT64, segment_end, NULL);
58 }
59
60 void
61 gst_query_parse_seeking_response (GstQuery * query, GstFormat * format,
62     gboolean * seekable, gint64 * segment_start, gint64 * segment_end)
63 {
64   GstStructure *structure;
65
66   g_return_if_fail (GST_QUERY_TYPE (query) == GST_QUERY_SEEKING);
67
68   structure = gst_query_get_structure (query);
69   if (format)
70     *format = g_value_get_enum (gst_structure_get_value (structure, "format"));
71   if (seekable)
72     *seekable = g_value_get_boolean (gst_structure_get_value
73         (structure, "seekable"));
74   if (segment_start)
75     *segment_start = g_value_get_int64 (gst_structure_get_value
76         (structure, "segment-start"));
77   if (segment_end)
78     *segment_end = g_value_get_int64 (gst_structure_get_value
79         (structure, "segment-end"));
80 }
81
82 void
83 gst_query_set_formats (GstQuery * query, gint n_formats, ...)
84 {
85   va_list ap;
86   GValue list = { 0, };
87   GValue item = { 0, };
88   GstStructure *structure;
89   gint i;
90
91   g_value_init (&list, GST_TYPE_LIST);
92
93   va_start (ap, n_formats);
94
95   for (i = 0; i < n_formats; i++) {
96     g_value_init (&item, GST_TYPE_FORMAT);
97     g_value_set_enum (&item, va_arg (ap, GstFormat));
98     gst_value_list_append_value (&list, &item);
99     g_value_unset (&item);
100   }
101
102   va_end (ap);
103
104   structure = gst_query_get_structure (query);
105   gst_structure_set_value (structure, "formats", &list);
106 }