g_assert (GST_IS_ELEMENT (src));
g_assert (GST_IS_ELEMENT (sink));
- GST_INFO (GST_CAT_PIPELINE, "linking %s(%s):%u to %s(%s):%u",
+ GST_INFO (GST_CAT_PIPELINE, "linking %s(%s):%u to %s(%s):%u with caps \"%s\"",
GST_ELEMENT_NAME (src), link->src_name ? link->src_name : "---", g_slist_length (srcs),
- GST_ELEMENT_NAME (sink), link->sink_name ? link->sink_name : "---", g_slist_length (sinks));
+ GST_ELEMENT_NAME (sink), link->sink_name ? link->sink_name : "---", g_slist_length (sinks),
+ link->caps ? gst_caps_to_string (link->caps) : "-");
if (!srcs || !sinks) {
if (gst_element_link_pads_filtered (src, srcs ? (const gchar *) srcs->data : NULL,
%token <s> IDENTIFIER
%left <s> REF PADREF BINREF
%token <s> ASSIGNMENT
+%token <s> LINK
%type <g> graph
%type <c> chain bin
| /* NOP */ { MAKE_REF ($$, NULL, NULL); }
;
-link: linkpart '!' linkpart { $$ = $1;
+link: linkpart LINK linkpart { $$ = $1;
+ if ($2) {
+ $$->caps = gst_caps_from_string ($2);
+ if (!$$->caps)
+ ERROR (GST_PARSE_ERROR_LINK, "could not parse caps \"%s\"", $2);
+ gst_parse_strfree ($2);
+ }
$$->sink_name = $3->src_name;
$$->sink_pads = $3->src_pads;
gst_parse_link_free ($3);
#define YY_DECL int _gst_parse_yylex (YYSTYPE *lvalp)
%}
-_operators [(){}.:!,=]
+_operator [(){}.:!,;=]
_identifier [[:alpha:]][[:alnum:]\-_%]*
_char ("\\".)|([^[:space:]])
-_string {_char}+|("\""([^\"]|"\\\"")*"\"")
+_string {_char}+|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\"")*"'")
_comma [[:space:]]*","[[:space:]]*
_assign [[:space:]]*"="[[:space:]]*
_ref {_identifier}"."{_identifier}?
_binref {_identifier}[[:space:]]*"."[[:space:]]*"("
+/* links */
+_capschar ("\\".)|([^[:space:]!.,;()\]\[])
+_capsstring {_capschar}+|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\"")*"'")
+_mimetype ({_capschar}+"/"{_capschar}+)|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\"")*"'")
+_link ("!"[[:space:]]*{_mimetype}(","([^!]|{_capsstring})+)?[[:space:]]*"!")|("!")
+
%x value
%option noyywrap
%option nounput
return IDENTIFIER;
}
-{_operators} { PRINT ("OPERATOR: [%s]\n", yytext); return *yytext; }
+{_link} {
+ gchar *c = yytext;
+ PRINT ("LINK: %s\n", yytext);
+ c++;
+ if (*c) {
+ while (g_ascii_isspace (*c)) c++;
+ c = lvalp->s = gst_parse_strdup (c);
+ while (*c) c++;
+ g_assert (*--c == '!');
+ while (g_ascii_isspace (*--c));
+ *++c = '\0';
+ } else {
+ lvalp->s = NULL;
+ }
+ BEGIN (INITIAL);
+ return LINK;
+}
+
+{_operator} { PRINT ("OPERATOR: [%s]\n", yytext); return *yytext; }
[[:space:]]+ { PRINT ("SPACE: [%s]\n", yytext); }