void
__gst_parse_chain_free (chain_t *data)
{
- if (data) {
- /* g_print ("FREEING CHAIN (%3u): %p\n", __chains - 1, data); */
- g_free (data);
- g_return_if_fail (__chains > 0);
- __chains--;
- }
+ /* g_print ("FREEING CHAIN (%3u): %p\n", __chains - 1, data); */
+ g_free (data);
+ g_return_if_fail (__chains > 0);
+ __chains--;
}
#endif /* __GST_PARSE_TRACE */
#ifdef G_HAVE_ISO_VARARGS
#define SET_ERROR(error, type, ...) G_STMT_START{ \
- if (error) { \
- if (*(error)) { \
- g_warning (__VA_ARGS__); \
- } else { \
- g_set_error ((error), GST_PARSE_ERROR, (type), __VA_ARGS__); \
- }\
+ GST_CAT_ERROR (GST_CAT_PIPELINE, __VA_ARGS__); \
+ if ((error) && !*(error)) { \
+ g_set_error ((error), GST_PARSE_ERROR, (type), __VA_ARGS__); \
} \
}G_STMT_END
#define ERROR(type, ...) SET_ERROR (((graph_t *) graph)->error, (type), __VA_ARGS__ )
#elif defined(G_HAVE_GNUC_VARARGS)
#define SET_ERROR(error, type, args...) G_STMT_START{ \
- if (error) { \
- if (*(error)) { \
- g_warning ( args ); \
- } else { \
- g_set_error ((error), GST_PARSE_ERROR, (type), args ); \
- }\
+ GST_CAT_ERROR (GST_CAT_PIPELINE, args ); \
+ if ((error) && !*(error)) { \
+ g_set_error ((error), GST_PARSE_ERROR, (type), args ); \
} \
}G_STMT_END
#define ERROR(type, args...) SET_ERROR (((graph_t *) graph)->error, (type) , args )
}G_STMT_END
#endif
-#else
+#elif defined(G_HAVE_ISO_VARARGS)
#define SET_ERROR(error, type, ...) G_STMT_START{ \
- if (error) { \
- if (*(error)) { \
- g_warning ("error while parsing"); \
- } else { \
- g_set_error ((error), GST_PARSE_ERROR, (type), "error while parsing"); \
- }\
+ GST_CAT_ERROR (GST_CAT_PIPELINE, "error while parsing" ); \
+ if ((error) && !*(error)) { \
+ g_set_error ((error), GST_PARSE_ERROR, (type), "error while parsing"); \
} \
}G_STMT_END
#define ERROR(type, ...) SET_ERROR (((graph_t *) graph)->error, (type), "error while parsing")
# define YYDEBUG 1
#endif
-#endif /* G_HAVE_ISO_VARARGS */
+#else
+
+static inline void
+SET_ERROR (GError **error, gint type, const char *format, ...)
+{
+ if (error) {
+ if (*error) {
+ g_warning ("error while parsing");
+ } else {
+ va_list varargs;
+ char *string;
+
+ va_start (varargs, format);
+ string = g_strdup_vprintf (format, varargs);
+ va_end (varargs);
+
+ g_set_error (error, GST_PARSE_ERROR, type, string);
+
+ g_free (string);
+ }
+ }
+}
+
+#ifndef GST_DISABLE_GST_DEBUG
+# define YYDEBUG 1
+static inline void
+YYPRINTF(const char *format, ...)
+{
+ va_list varargs;
+ gchar *temp;
+
+ va_start (varargs, format);
+ temp = g_strdup_vprintf ( format, varargs );
+ GST_CAT_LOG (GST_CAT_PIPELINE, "%s", temp);
+ g_free (temp);
+ va_end (varargs);
+}
+#endif
+
+#endif
#define GST_BIN_MAKE(res, type, chainval, assign) G_STMT_START{ \
chain_t *chain = chainval; \
GSList *walk; \
GstBin *bin = (GstBin *) gst_element_factory_make (type, NULL); \
if (!chain) { \
- ERROR (GST_PARSE_ERROR_EMPTY_BIN, _("specified empty bin \"%s\", not allowed"), type); \
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_EMPTY_BIN, _("specified empty bin \"%s\", not allowed"), type); \
g_slist_foreach (assign, (GFunc) gst_parse_strfree, NULL); \
g_slist_free (assign); \
YYERROR; \
} else if (!bin) { \
- ERROR (GST_PARSE_ERROR_NO_SUCH_ELEMENT, _("no bin \"%s\", skipping"), type); \
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT, _("no bin \"%s\", skipping"), type); \
g_slist_foreach (assign, (GFunc) gst_parse_strfree, NULL); \
g_slist_free (assign); \
res = chain; \
} else { \
- walk = chain->elements; \
- while (walk) { \
+ for (walk = chain->elements; walk; walk = walk->next ) \
gst_bin_add (bin, GST_ELEMENT (walk->data)); \
- walk = walk->next; \
- } \
g_slist_free (chain->elements); \
chain->elements = g_slist_prepend (NULL, bin); \
res = chain; \
/* set the properties now */ \
- walk = assign; \
- while (walk) { \
+ for (walk = assign; walk; walk = walk->next) \
gst_parse_element_set ((gchar *) walk->data, GST_ELEMENT (bin), graph); \
- walk = g_slist_next (walk); \
- } \
g_slist_free (assign); \
} \
}G_STMT_END
}
g_object_set_property (G_OBJECT (element), value, &v);
} else {
- ERROR (GST_PARSE_ERROR_NO_SUCH_PROPERTY, _("no property \"%s\" in element \"%s\""), value, GST_ELEMENT_NAME (element));
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_NO_SUCH_PROPERTY, _("no property \"%s\" in element \"%s\""), value, GST_ELEMENT_NAME (element));
}
out:
return;
error:
- ERROR (GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY,
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY,
_("could not set property \"%s\" in element \"%s\" to \"%s\""),
value, GST_ELEMENT_NAME (element), pos);
goto out;
error_conversion:
- ERROR (GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY,
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY,
_("could not convert \"%s\" so that it fits property \"%s\" in element \"%s\""),
pos, value, GST_ELEMENT_NAME (element));
goto out;
if (gst_element_is_locked_state (element) == lock)
return;
/* check if we have an unlocked peer */
- while (walk) {
+ for (; walk; walk = walk->next) {
pad = (GstPad *) GST_PAD_REALIZE (walk->data);
- walk = walk->next;
if (GST_PAD_IS_SINK (pad) && GST_PAD_PEER (pad) &&
!gst_element_is_locked_state (GST_PAD_PARENT (GST_PAD_PEER (pad)))) {
unlocked_peer = TRUE;
/* check if there are other pads to (un)lock */
walk = (GList *) gst_element_get_pad_list (element);
- while (walk) {
+ for (; walk; walk = walk->next) {
pad = (GstPad *) GST_PAD_REALIZE (walk->data);
- walk = walk->next;
if (GST_PAD_IS_SRC (pad) && GST_PAD_PEER (pad)) {
GstElement *next = GST_ELEMENT (GST_OBJECT_PARENT (GST_PAD_PEER (pad)));
if (gst_element_is_locked_state (next) != lock)
{
GList *templs = gst_element_get_pad_template_list (src);
- while (templs) {
+ for (; templs; templs = templs->next) {
GstPadTemplate *templ = (GstPadTemplate *) templs->data;
if ((GST_PAD_TEMPLATE_DIRECTION (templ) == GST_PAD_SRC) && (GST_PAD_TEMPLATE_PRESENCE(templ) == GST_PAD_SOMETIMES))
{
G_CALLBACK (gst_parse_found_pad), data);
return TRUE;
}
- templs = g_list_next (templs);
}
return FALSE;
}
return 0;
error:
- ERROR (GST_PARSE_ERROR_LINK, _("could not link %s to %s"), GST_ELEMENT_NAME (src), GST_ELEMENT_NAME (sink));
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("could not link %s to %s"), GST_ELEMENT_NAME (src), GST_ELEMENT_NAME (sink));
gst_parse_free_link (link);
return -1;
}
element: IDENTIFIER { $$ = gst_element_factory_make ($1, NULL);
if (!$$)
- ERROR (GST_PARSE_ERROR_NO_SUCH_ELEMENT, _("no element \"%s\""), $1);
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT, _("no element \"%s\""), $1);
gst_parse_strfree ($1);
if (!$$)
YYERROR;
if ($2) {
$$->caps = gst_caps_from_string ($2);
if (!$$->caps)
- ERROR (GST_PARSE_ERROR_LINK, _("could not parse caps \"%s\""), $2);
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("could not parse caps \"%s\""), $2);
gst_parse_strfree ($2);
}
$$->sink_name = $3->src_name;
| bin { $$ = $1; }
| chain chain { if ($1->back && $2->front) {
if (!$1->back->sink_name) {
- ERROR (GST_PARSE_ERROR_LINK, _("link without source element"));
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without source element"));
gst_parse_free_link ($1->back);
} else {
((graph_t *) graph)->links = g_slist_prepend (((graph_t *) graph)->links, $1->back);
}
if (!$2->front->src_name) {
- ERROR (GST_PARSE_ERROR_LINK, _("link without sink element"));
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without sink element"));
gst_parse_free_link ($2->front);
} else {
((graph_t *) graph)->links = g_slist_prepend (((graph_t *) graph)->links, $2->front);
$1->last = $2->last;
$1->back = $2->back;
$1->elements = g_slist_concat ($1->elements, $2->elements);
- gst_parse_chain_free ($2);
+ if ($2)
+ gst_parse_chain_free ($2);
$$ = $1;
}
| chain linklist { GSList *walk;
((link_t *) $2->data)->src = $1->last;
}
}
- walk = $2;
- while (walk) {
+ for (walk = $2; walk; walk = walk->next) {
link_t *link = (link_t *) walk->data;
- walk = walk->next;
- if (!link->sink_name && walk) {
- ERROR (GST_PARSE_ERROR_LINK, _("link without sink element"));
+ if (!link->sink_name && walk->next) {
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without sink element"));
gst_parse_free_link (link);
} else if (!link->src_name && !link->src) {
- ERROR (GST_PARSE_ERROR_LINK, _("link without source element"));
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without source element"));
gst_parse_free_link (link);
} else {
- if (walk) {
+ if (walk->next) {
((graph_t *) graph)->links = g_slist_prepend (((graph_t *) graph)->links, link);
} else {
$1->back = link;
| chain error { $$ = $1; }
| link chain { if ($2->front) {
if (!$2->front->src_name) {
- ERROR (GST_PARSE_ERROR_LINK, _("link without source element"));
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without source element"));
gst_parse_free_link ($2->front);
} else {
((graph_t *) graph)->links = g_slist_prepend (((graph_t *) graph)->links, $2->front);
GstElement *element =
gst_element_make_from_uri (GST_URI_SRC, $1, NULL);
if (!element) {
- ERROR (GST_PARSE_ERROR_NO_SUCH_ELEMENT,
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT,
_("no source element for URI \"%s\""), $1);
} else {
$$->front->src = element;
$$->elements = g_slist_prepend ($$->elements, element);
}
} else {
- ERROR (GST_PARSE_ERROR_LINK,
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK,
_("no element to link URI \"%s\" to"), $1);
}
g_free ($1);
| link PARSE_URL { GstElement *element =
gst_element_make_from_uri (GST_URI_SINK, $2, NULL);
if (!element) {
- ERROR (GST_PARSE_ERROR_NO_SUCH_ELEMENT,
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT,
_("no sink element for URI \"%s\""), $2);
YYERROR;
} else if ($1->sink_name || $1->sink_pads) {
- ERROR (GST_PARSE_ERROR_LINK,
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK,
_("could not link sink element for URI \"%s\""), $2);
YYERROR;
} else {
g_free ($2);
}
;
-graph: /* NOP */ { ERROR (GST_PARSE_ERROR_EMPTY, _("empty pipeline not allowed"));
+graph: /* NOP */ { SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_EMPTY, _("empty pipeline not allowed"));
$$ = (graph_t *) graph;
}
| chain { $$ = (graph_t *) graph;
if ($1->front) {
if (!$1->front->src_name) {
- ERROR (GST_PARSE_ERROR_LINK, _("link without source element"));
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without source element"));
gst_parse_free_link ($1->front);
} else {
$$->links = g_slist_prepend ($$->links, $1->front);
}
if ($1->back) {
if (!$1->back->sink_name) {
- ERROR (GST_PARSE_ERROR_LINK, _("link without sink element"));
+ SET_ERROR (((graph_t *) graph)->error, GST_PARSE_ERROR_LINK, _("link without sink element"));
gst_parse_free_link ($1->back);
} else {
$$->links = g_slist_prepend ($$->links, $1->back);
return -1;
}
-int _gst_parse_yy_scan_string (char*);
+struct yy_buffer_state * _gst_parse_yy_scan_string (char*);
+void _gst_parse_yy_delete_buffer (struct yy_buffer_state *);
GstElement *
_gst_parse_launch (const gchar *str, GError **error)
{
GSList *walk;
GstBin *bin = NULL;
GstElement *ret;
+ struct yy_buffer_state *buf;
g_return_val_if_fail (str != NULL, NULL);
#endif /* __GST_PARSE_TRACE */
dstr = g_strdup (str);
- _gst_parse_yy_scan_string (dstr);
+ buf = _gst_parse_yy_scan_string (dstr);
#ifndef GST_DISABLE_GST_DEBUG
yydebug = 1;
#endif
if (yyparse (&g) != 0) {
- SET_ERROR (error, GST_PARSE_ERROR_SYNTAX, "Unrecoverable syntax error while parsing pipeline");
+ SET_ERROR (error, GST_PARSE_ERROR_SYNTAX, "Unrecoverable syntax error while parsing pipeline %s", str);
goto error1;
}
g_free (dstr);
+ _gst_parse_yy_delete_buffer (buf);
GST_CAT_DEBUG (GST_CAT_PIPELINE, "got %u elements and %u links", g.chain ? g_slist_length (g.chain->elements) : 0, g_slist_length (g.links));
g_slist_free (((chain_t *) g.chain)->elements);
if (GST_IS_BIN (ret))
bin = GST_BIN (ret);
+ gst_parse_chain_free (g.chain);
} else {
/* put all elements in our bin */
bin = GST_BIN (gst_element_factory_make ("pipeline", NULL));
g_assert (bin);
- walk = g.chain->elements;
- while (walk) {
+
+ for (walk = g.chain->elements; walk; walk = walk->next)
gst_bin_add (bin, GST_ELEMENT (walk->data));
- walk = g_slist_next (walk);
- }
+
g_slist_free (g.chain->elements);
ret = GST_ELEMENT (bin);
+ gst_parse_chain_free (g.chain);
}
- gst_parse_chain_free (g.chain);
/* remove links */
- walk = g.links;
- while (walk) {
+ for (walk = g.links; walk; walk = walk->next) {
link_t *l = (link_t *) walk->data;
- GstElement *sink;
- walk = g_slist_next (walk);
if (!l->src) {
if (l->src_name) {
if (bin) {
continue;
}
}
- sink = l->sink;
gst_parse_perform_link (l, &g);
}
g_slist_free (g.links);
g_free (dstr);
if (g.chain) {
- walk = g.chain->elements;
- while (walk) {
- gst_object_unref (GST_OBJECT (walk->data));
- walk = walk->next;
- }
+ g_slist_foreach (g.chain->elements, (GFunc)gst_object_unref, NULL);
g_slist_free (g.chain->elements);
+ gst_parse_chain_free (g.chain);
}
- gst_parse_chain_free (g.chain);
-
- walk = g.links;
- while (walk) {
- gst_parse_free_link ((link_t *) walk->data);
- walk = walk->next;
- }
+
+ g_slist_foreach (g.links, (GFunc)gst_parse_free_link, NULL);
g_slist_free (g.links);
- g_assert (*error);
+ if (error)
+ g_assert (*error);
ret = NULL;
goto out;