* Don't start the message with a capital, and don't end them with a period,
* as they will be presented inside a sentence/error.
*/
-
+
#define YYERROR_VERBOSE 1
#define YYLEX_PARAM scanner
+#define YYENABLE_NLS 0
+
+#ifndef YYLTYPE_IS_TRIVIAL
+#define YYLTYPE_IS_TRIVIAL 0
+#endif
+
typedef void* yyscan_t;
-int _gst_parse_yylex (void * yylval_param , yyscan_t yyscanner);
-int _gst_parse_yylex_init (yyscan_t scanner);
-int _gst_parse_yylex_destroy (yyscan_t scanner);
-struct yy_buffer_state * _gst_parse_yy_scan_string (char* , yyscan_t);
+int priv_gst_parse_yylex (void * yylval_param , yyscan_t yyscanner);
+int priv_gst_parse_yylex_init (yyscan_t scanner);
+int priv_gst_parse_yylex_destroy (yyscan_t scanner);
+struct yy_buffer_state * priv_gst_parse_yy_scan_string (char* , yyscan_t);
void _gst_parse_yypush_buffer_state (void * new_buffer ,yyscan_t yyscanner );
void _gst_parse_yypop_buffer_state (yyscan_t yyscanner );
gchar *
__gst_parse_strdup (gchar *org)
{
- gchar *ret;
+ gchar *ret;
__strings++;
ret = g_strdup (org);
/* g_print ("ALLOCATED STR (%3u): %p %s\n", __strings, ret, ret); */
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);
{
va_list varargs;
gchar *temp;
-
+
va_start (varargs, format);
temp = g_strdup_vprintf (format, varargs);
GST_CAT_LOG (GST_CAT_PIPELINE, "%s", temp);
gst_parse_add_delayed_set (GstElement *element, gchar *name, gchar *value_str)
{
DelayedSet *data = g_slice_new0 (DelayedSet);
-
+
GST_CAT_LOG_OBJECT (GST_CAT_PIPELINE, element, "delaying property set %s to %s",
name, value_str);
-
+
data->name = g_strdup(name);
data->value_str = g_strdup(value_str);
data->signal_id = g_signal_connect_data(element, "child-added",
G_CALLBACK (gst_parse_new_child), data, (GClosureNotify)
gst_parse_free_delayed_set, (GConnectFlags) 0);
-
+
/* FIXME: we would need to listen on all intermediate bins too */
if (GST_IS_BIN (element)) {
gchar **names, **current;
GstElement *parent, *child;
-
+
current = names = g_strsplit (name, "::", -1);
parent = gst_bin_get_by_name (GST_BIN_CAST (element), current[0]);
current++;
child = gst_bin_get_by_name (GST_BIN (parent), current[0]);
if (!child && current[1]) {
char *sub_name = g_strjoinv ("::", ¤t[0]);
-
+
gst_parse_add_delayed_set(parent, sub_name, value_str);
g_free (sub_name);
}
{
DelayedSet *set = (DelayedSet *) data;
GParamSpec *pspec;
- GValue v = { 0, };
+ GValue v = { 0, };
GstObject *target = NULL;
GType value_type;
-
+
GST_CAT_LOG_OBJECT (GST_CAT_PIPELINE, child_proxy, "new child %s, checking property %s",
GST_OBJECT_NAME(object), set->name);
- if (gst_child_proxy_lookup (GST_OBJECT (child_proxy), set->name, &target, &pspec)) {
+ if (gst_child_proxy_lookup (G_OBJECT (child_proxy), set->name, &target, &pspec)) {
gboolean got_value = FALSE;
value_type = pspec->value_type;
got_value = TRUE;
else if (g_type_is_a (value_type, GST_TYPE_ELEMENT)) {
GstElement *bin;
-
+
bin = gst_parse_bin_from_description (set->value_str, TRUE, NULL);
if (bin) {
g_value_set_object (&v, bin);
{
GParamSpec *pspec;
gchar *pos = value;
- GValue v = { 0, };
+ GValue v = { 0, };
GstObject *target = NULL;
GType value_type;
/* parse the string, so the property name is null-terminated an pos points
to the beginning of the value */
- while (!g_ascii_isspace (*pos) && (*pos != '=')) pos++;
- if (*pos == '=') {
- *pos = '\0';
- } else {
- *pos = '\0';
+ while (!g_ascii_isspace (*pos) && (*pos != '=')) pos++;
+ if (*pos == '=') {
+ *pos = '\0';
+ } else {
+ *pos = '\0';
pos++;
- while (g_ascii_isspace (*pos)) pos++;
- }
- pos++;
- while (g_ascii_isspace (*pos)) pos++;
+ while (g_ascii_isspace (*pos)) pos++;
+ }
+ pos++;
+ while (g_ascii_isspace (*pos)) pos++;
if (*pos == '"') {
pos++;
pos[strlen (pos) - 1] = '\0';
}
gst_parse_unescape (pos);
- if (gst_child_proxy_lookup (GST_OBJECT (element), value, &target, &pspec)) {
+ if (gst_child_proxy_lookup (G_OBJECT (element), value, &target, &pspec)) {
gboolean got_value = FALSE;
value_type = pspec->value_type;
got_value = TRUE;
else if (g_type_is_a (value_type, GST_TYPE_ELEMENT)) {
GstElement *bin;
-
+
bin = gst_parse_bin_from_description (pos, TRUE, NULL);
if (bin) {
g_value_set_object (&v, bin);
if (!got_value)
goto error;
g_object_set_property (G_OBJECT (target), pspec->name, &v);
- } else {
+ } else {
/* do a delayed set */
if (GST_IS_CHILD_PROXY (element)) {
gst_parse_add_delayed_set (element, value, pos);
if (target)
gst_object_unref (target);
return;
-
+
error:
SET_ERROR (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);
+ _("could not set property \"%s\" in element \"%s\" to \"%s\""),
+ value, GST_ELEMENT_NAME (element), pos);
goto out;
}
g_slist_free (link->src_pads);
g_slist_free (link->sink_pads);
if (link->caps) gst_caps_unref (link->caps);
- gst_parse_link_free (link);
+ gst_parse_link_free (link);
}
static void
{
DelayedLink *link = data;
- GST_CAT_INFO (GST_CAT_PIPELINE, "trying delayed linking %s:%s to %s:%s",
+ GST_CAT_INFO (GST_CAT_PIPELINE, "trying delayed linking %s:%s to %s:%s",
GST_STR_NULL (GST_ELEMENT_NAME (src)), GST_STR_NULL (link->src_pad),
GST_STR_NULL (GST_ELEMENT_NAME (link->sink)), GST_STR_NULL (link->sink_pad));
link->sink_pad, link->caps)) {
/* do this here, we don't want to get any problems later on when
* unlocking states */
- GST_CAT_DEBUG (GST_CAT_PIPELINE, "delayed linking %s:%s to %s:%s worked",
+ GST_CAT_DEBUG (GST_CAT_PIPELINE, "delayed linking %s:%s to %s:%s worked",
GST_STR_NULL (GST_ELEMENT_NAME (src)), GST_STR_NULL (link->src_pad),
GST_STR_NULL (GST_ELEMENT_NAME (link->sink)), GST_STR_NULL (link->sink_pad));
g_signal_handler_disconnect (src, link->signal_id);
/* both padnames and the caps may be NULL */
static gboolean
-gst_parse_perform_delayed_link (GstElement *src, const gchar *src_pad,
+gst_parse_perform_delayed_link (GstElement *src, const gchar *src_pad,
GstElement *sink, const gchar *sink_pad,
GstCaps *caps)
{
GList *templs = gst_element_class_get_pad_template_list (
GST_ELEMENT_GET_CLASS (src));
-
+
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))
{
- DelayedLink *data = g_slice_new (DelayedLink);
-
+ DelayedLink *data = g_slice_new (DelayedLink);
+
/* TODO: maybe we should check if src_pad matches this template's names */
- GST_CAT_DEBUG (GST_CAT_PIPELINE, "trying delayed link %s:%s to %s:%s",
+ GST_CAT_DEBUG (GST_CAT_PIPELINE, "trying delayed link %s:%s to %s:%s",
GST_STR_NULL (GST_ELEMENT_NAME (src)), GST_STR_NULL (src_pad),
GST_STR_NULL (GST_ELEMENT_NAME (sink)), GST_STR_NULL (sink_pad));
GSList *sinks = link->sink_pads;
g_assert (GST_IS_ELEMENT (src));
g_assert (GST_IS_ELEMENT (sink));
-
+
GST_CAT_INFO (GST_CAT_PIPELINE,
- "linking %s:%s to %s:%s (%u/%u) with caps \"%" GST_PTR_FORMAT "\"",
+ "linking %s:%s to %s:%s (%u/%u) with caps \"%" GST_PTR_FORMAT "\"",
GST_ELEMENT_NAME (src), link->src_name ? link->src_name : "(any)",
GST_ELEMENT_NAME (sink), link->sink_name ? link->sink_name : "(any)",
g_slist_length (srcs), g_slist_length (sinks), link->caps);
}
}
}
- if (g_slist_length (link->src_pads) != g_slist_length (link->src_pads)) {
+ if (g_slist_length (link->src_pads) != g_slist_length (link->sink_pads)) {
goto error;
}
while (srcs && sinks) {
}
}
}
-
+
success:
gst_parse_free_link (link);
return 0;
-
+
error:
SET_ERROR (graph->error, GST_PARSE_ERROR_LINK,
_("could not link %s to %s"), GST_ELEMENT_NAME (src),
%type <l> reference
%type <l> linkpart link
%type <p> linklist
-%type <e> element
+%type <e> element
%type <p> padlist pads assignments
%left '(' ')'
%start graph
%%
-element: IDENTIFIER { $$ = gst_element_factory_make ($1, NULL);
+element: IDENTIFIER { $$ = gst_element_factory_make ($1, NULL);
if ($$ == NULL) {
ADD_MISSING_ELEMENT (graph, $1);
SET_ERROR (graph->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT, _("no element \"%s\""), $1);
;
assignments: /* NOP */ { $$ = NULL; }
| assignments ASSIGNMENT { $$ = g_slist_prepend ($1, $2); }
- ;
+ ;
bin: '(' assignments chain ')' { GST_BIN_MAKE ($$, "bin", $3, $2, no_free); }
| BINREF assignments chain ')' { GST_BIN_MAKE ($$, $1, $3, $2, gst_parse_strfree);
gst_parse_strfree ($1);
gst_parse_strfree ($1);
}
;
-
+
pads: PADREF { $$ = g_slist_prepend (NULL, $1); }
| PADREF padlist { $$ = $2;
$$ = g_slist_prepend ($$, $1);
- }
+ }
;
padlist: ',' IDENTIFIER { $$ = g_slist_prepend (NULL, $2); }
| ',' IDENTIFIER padlist { $$ = g_slist_prepend ($3, $2); }
;
-
+
reference: REF { MAKE_REF ($$, $1, NULL); }
| REF padlist { MAKE_REF ($$, $1, $2); }
;
| pads { MAKE_REF ($$, NULL, $1); }
| /* NOP */ { MAKE_REF ($$, NULL, NULL); }
;
-
+
link: linkpart LINK linkpart { $$ = $1;
if ($2) {
$$->caps = gst_caps_from_string ($2);
gst_parse_link_free ($3);
}
;
-
+
linklist: link { $$ = g_slist_prepend (NULL, $1); }
| link linklist { $$ = g_slist_prepend ($2, $1); }
| linklist error { $$ = $1; }
- ;
+ ;
chain: element { $$ = gst_parse_chain_new ();
$$->first = $$->last = $1;
}
$1->back = $2->front;
}
-
+
if ($1->back) {
graph->links = g_slist_prepend (graph->links, $1->back);
}
} else {
if (!((link_t *) $2->data)->src_name) {
((link_t *) $2->data)->src = $1->last;
- }
+ }
}
for (walk = $2; walk; walk = walk->next) {
link_t *link = (link_t *) walk->data;
}
| PARSE_URL chain { $$ = $2;
if ($$->front) {
- GstElement *element =
+ GstElement *element =
gst_element_make_from_uri (GST_URI_SRC, $1, NULL);
if (!element) {
- SET_ERROR (graph->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT,
+ SET_ERROR (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 {
- SET_ERROR (graph->error, GST_PARSE_ERROR_LINK,
+ SET_ERROR (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) {
- SET_ERROR (graph->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT,
+ SET_ERROR (graph->error, GST_PARSE_ERROR_NO_SUCH_ELEMENT,
_("no sink element for URI \"%s\""), $2);
gst_parse_link_free ($1);
g_free ($2);
YYERROR;
} else if ($1->sink_name || $1->sink_pads) {
gst_object_unref (element);
- SET_ERROR (graph->error, GST_PARSE_ERROR_LINK,
+ SET_ERROR (graph->error, GST_PARSE_ERROR_LINK,
_("could not link sink element for URI \"%s\""), $2);
gst_parse_link_free ($1);
g_free ($2);
GstElement *
-_gst_parse_launch (const gchar *str, GError **error, GstParseContext *ctx,
+priv_gst_parse_launch (const gchar *str, GError **error, GstParseContext *ctx,
GstParseFlags flags)
{
graph_t g;
g.error = error;
g.ctx = ctx;
g.flags = flags;
-
+
#ifdef __GST_PARSE_TRACE
GST_CAT_DEBUG (GST_CAT_PIPELINE, "TRACE: tracing enabled");
__strings = __chains = __links = 0;
#endif /* __GST_PARSE_TRACE */
dstr = g_strdup (str);
- _gst_parse_yylex_init (&scanner);
- _gst_parse_yy_scan_string (dstr, scanner);
+ priv_gst_parse_yylex_init (&scanner);
+ priv_gst_parse_yy_scan_string (dstr, scanner);
#ifndef YYDEBUG
yydebug = 1;
if (yyparse (scanner, &g) != 0) {
SET_ERROR (error, GST_PARSE_ERROR_SYNTAX,
"Unrecoverable syntax error while parsing pipeline %s", str);
-
- _gst_parse_yylex_destroy (scanner);
+
+ priv_gst_parse_yylex_destroy (scanner);
g_free (dstr);
-
+
goto error1;
}
- _gst_parse_yylex_destroy (scanner);
+ priv_gst_parse_yylex_destroy (scanner);
g_free (dstr);
-
+
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));
-
+
if (!g.chain) {
ret = NULL;
} else if (!g.chain->elements->next) {
- /* only one toplevel element */
+ /* only one toplevel element */
ret = (GstElement *) g.chain->elements->data;
g_slist_free (g.chain->elements);
if (GST_IS_BIN (ret))
bin = GST_BIN (ret);
gst_parse_chain_free (g.chain);
- } else {
+ } else {
/* put all elements in our bin */
bin = GST_BIN (gst_element_factory_make ("pipeline", NULL));
g_assert (bin);
-
+
for (walk = g.chain->elements; walk; walk = walk->next) {
if (walk->data != NULL)
gst_bin_add (bin, GST_ELEMENT (walk->data));
}
-
+
g_slist_free (g.chain->elements);
ret = GST_ELEMENT (bin);
gst_parse_chain_free (g.chain);
}
-
+
/* remove links */
for (walk = g.links; walk; walk = walk->next) {
link_t *l = (link_t *) walk->data;
#endif /* __GST_PARSE_TRACE */
return ret;
-
+
error1:
if (g.chain) {
g_slist_foreach (g.chain->elements, (GFunc)gst_object_unref, NULL);
g_slist_foreach (g.links, (GFunc)gst_parse_free_link, NULL);
g_slist_free (g.links);
-
+
if (error)
g_assert (*error);
ret = NULL;
-
+
goto out;
}