gst/: Maintain API and ABI when --disable-parse is used. Now that we have an appropri...
[platform/upstream/gstreamer.git] / gst / gstparse.c
1 /* GStreamer
2  * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
3  *                    2000 Wim Taymans <wtay@chello.be>
4  *                    2002 Andy Wingo <wingo@pobox.com>
5  *
6  * gstparse.c: get a pipeline from a text pipeline description
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23
24 /**
25  * SECTION:gstparse
26  * @short_description: Get a pipeline from a text pipeline description
27  *
28  * These function allow to create a pipeline based on the syntax used in the
29  * gst-launch utillity.
30  */
31
32
33 #include "gst_private.h"
34 #include <string.h>
35
36 #include "gstparse.h"
37 #include "gsterror.h"
38 #include "gstinfo.h"
39
40 extern GstElement *_gst_parse_launch (const gchar *, GError **);
41
42 /**
43  * gst_parse_error_quark:
44  *
45  * Get the error quark used by the parsing subsystem.
46  *
47  * Returns: the quark of the parse errors.
48  */
49 GQuark
50 gst_parse_error_quark (void)
51 {
52   static GQuark quark = 0;
53
54   if (!quark)
55     quark = g_quark_from_static_string ("gst_parse_error");
56   return quark;
57 }
58
59 #ifndef GST_DISABLE_PARSE
60 static gchar *
61 _gst_parse_escape (const gchar * str)
62 {
63   GString *gstr = NULL;
64   gchar *newstr = NULL;
65
66   g_return_val_if_fail (str != NULL, NULL);
67
68   gstr = g_string_sized_new (strlen (str));
69
70   while (*str) {
71     if (*str == ' ')
72       g_string_append_c (gstr, '\\');
73     g_string_append_c (gstr, *str);
74     str++;
75   }
76
77   newstr = gstr->str;
78   g_string_free (gstr, FALSE);
79
80   return newstr;
81 }
82 #endif /* !GST_DISABLE_PARSE */
83
84 /**
85  * gst_parse_launchv:
86  * @argv: null-terminated array of arguments
87  * @error: pointer to a #GError
88  *
89  * Create a new element based on command line syntax.
90  * @error will contain an error message if an erroneuos pipeline is specified.
91  * An error does not mean that the pipeline could not be constructed.
92  *
93  * Returns: a new element on success and %NULL on failure.
94  */
95 GstElement *
96 gst_parse_launchv (const gchar ** argv, GError ** error)
97 {
98 #ifndef GST_DISABLE_PARSE
99   GstElement *element;
100   GString *str;
101   const gchar **argvp, *arg;
102   gchar *tmp;
103
104   g_return_val_if_fail (argv != NULL, NULL);
105
106   /* let's give it a nice size. */
107   str = g_string_sized_new (1024);
108
109   argvp = argv;
110   while (*argvp) {
111     arg = *argvp;
112     tmp = _gst_parse_escape (arg);
113     g_string_append (str, tmp);
114     g_free (tmp);
115     g_string_append (str, " ");
116     argvp++;
117   }
118
119   element = gst_parse_launch (str->str, error);
120
121   g_string_free (str, TRUE);
122
123   return element;
124 #else
125   gchar *msg;
126
127   GST_WARNING ("Disabled API called: gst_parse_launchv()");
128
129   msg = gst_error_get_message (GST_CORE_ERROR, GST_CORE_ERROR_DISABLED);
130   g_set_error (error, GST_CORE_ERROR, GST_CORE_ERROR_DISABLED, "%s", msg);
131   g_free (msg);
132
133   return NULL;
134 #endif
135 }
136
137 /**
138  * gst_parse_launch:
139  * @pipeline_description: the command line describing the pipeline
140  * @error: the error message in case of an erroneous pipeline.
141  *
142  * Create a new pipeline based on command line syntax.
143  * Please note that you might get a return value that is not %NULL even though
144  * the @error is set. In this case there was a recoverable parsing error and you
145  * can try to play the pipeline.
146  *
147  * Returns: a new element on success, %NULL on failure. If more than one toplevel
148  * element is specified by the @pipeline_description, all elements are put into
149  * a #GstPipeline, which than is returned.
150  */
151 GstElement *
152 gst_parse_launch (const gchar * pipeline_description, GError ** error)
153 {
154 #ifndef GST_DISABLE_PARSE
155   GstElement *element;
156
157   g_return_val_if_fail (pipeline_description != NULL, NULL);
158
159   GST_CAT_INFO (GST_CAT_PIPELINE, "parsing pipeline description %s",
160       pipeline_description);
161
162   element = _gst_parse_launch (pipeline_description, error);
163
164   return element;
165 #else
166   gchar *msg;
167
168   GST_WARNING ("Disabled API called: gst_parse_launch()");
169
170   msg = gst_error_get_message (GST_CORE_ERROR, GST_CORE_ERROR_DISABLED);
171   g_set_error (error, GST_CORE_ERROR, GST_CORE_ERROR_DISABLED, "%s", msg);
172   g_free (msg);
173
174   return NULL;
175 #endif
176 }