mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-23 02:01:12 +00:00
form a semantic representation of the pipeline in preparation for actual instantiation.
Original commit message from CVS: * form a semantic representation of the pipeline in preparation for actual instantiation. the parser is shaping up quite nicely; it should, in theory, be able to create all types of pipelines that gstreamer supports
This commit is contained in:
parent
f6112a24bb
commit
66107d8717
4 changed files with 123 additions and 24 deletions
|
@ -2,12 +2,13 @@
|
||||||
|
|
||||||
#libgstparse_la_SOURCES = parse.c grammar.c
|
#libgstparse_la_SOURCES = parse.c grammar.c
|
||||||
|
|
||||||
BISON = bison -d
|
BISON = bison -d -v
|
||||||
|
|
||||||
noinst_PROGRAMS = grammar
|
noinst_PROGRAMS = grammar
|
||||||
|
|
||||||
grammar_SOURCES = lex.yy.c grammar.tab.c
|
grammar_SOURCES = lex.yy.c grammar.tab.c
|
||||||
grammar_CFLAGS = $(GLIB_CFLAGS)
|
grammar_CFLAGS = $(GLIB_CFLAGS)
|
||||||
|
grammar_LDADD = $(GLIB_LIBS)
|
||||||
|
|
||||||
noinst_HEADERS = grammar.tab.h
|
noinst_HEADERS = grammar.tab.h
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
%{
|
%{
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include "types.h"
|
||||||
#define YYDEBUG 1
|
#define YYDEBUG 1
|
||||||
#define YYERROR_VERBOSE 1
|
#define YYERROR_VERBOSE 1
|
||||||
%}
|
%}
|
||||||
|
@ -10,6 +11,11 @@
|
||||||
gboolean b;
|
gboolean b;
|
||||||
gint i;
|
gint i;
|
||||||
gchar *s;
|
gchar *s;
|
||||||
|
graph_t *g;
|
||||||
|
connection_t *c;
|
||||||
|
property_t *p;
|
||||||
|
element_t *e;
|
||||||
|
hash_t *h;
|
||||||
}
|
}
|
||||||
|
|
||||||
%token <s> IDENTIFIER STRING
|
%token <s> IDENTIFIER STRING
|
||||||
|
@ -17,6 +23,13 @@
|
||||||
%token <i> INTEGER
|
%token <i> INTEGER
|
||||||
%token <b> BOOLEAN
|
%token <b> BOOLEAN
|
||||||
|
|
||||||
|
%type <s> id
|
||||||
|
%type <h> qid
|
||||||
|
%type <g> graph bin
|
||||||
|
%type <e> element
|
||||||
|
%type <p> property_value value
|
||||||
|
%type <c> connection lconnection rconnection qconnection iconnection
|
||||||
|
|
||||||
%left '{' '}' '(' ')'
|
%left '{' '}' '(' ')'
|
||||||
%left '!' '='
|
%left '!' '='
|
||||||
%left '+'
|
%left '+'
|
||||||
|
@ -25,49 +38,92 @@
|
||||||
%start graph
|
%start graph
|
||||||
%%
|
%%
|
||||||
|
|
||||||
id: IDENTIFIER {}
|
id: IDENTIFIER
|
||||||
;
|
;
|
||||||
|
|
||||||
qid: id
|
qid: id { $$ = g_new0 (hash_t, 1); $$->id2 = $1 }
|
||||||
| id '.' id
|
| id '.' id { $$ = g_new0 (hash_t, 1); $$->id1 = $1; $$->id2 = $3; }
|
||||||
;
|
;
|
||||||
|
|
||||||
value: STRING {}
|
value: STRING { $$ = g_new0 (property_t, 1);
|
||||||
| FLOAT {}
|
$$->value_type = G_TYPE_STRING; $$->value.s = $1; }
|
||||||
| INTEGER {}
|
| FLOAT { $$ = g_new0 (property_t, 1);
|
||||||
| BOOLEAN {}
|
$$->value_type = G_TYPE_DOUBLE; $$->value.d = $1; }
|
||||||
|
| INTEGER { $$ = g_new0 (property_t, 1);
|
||||||
|
$$->value_type = G_TYPE_INT; $$->value.i = $1; }
|
||||||
|
| BOOLEAN { $$ = g_new0 (property_t, 1);
|
||||||
|
$$->value_type = G_TYPE_BOOLEAN; $$->value.b = $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
property_value: qid '=' value
|
property_value: id '=' value { $$ = $3; $$->name = $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
element: id
|
element: id { $$ = g_new0 (element_t, 1); $$->name = $1; }
|
||||||
| bin
|
|
||||||
;
|
;
|
||||||
|
|
||||||
graph: /* empty */
|
graph: /* empty */ { $$ = g_new0 (graph_t, 1); }
|
||||||
| graph element
|
| graph element { GList *l = $$->connections_pending;
|
||||||
| graph connection
|
$$ = $1;
|
||||||
| graph property_value
|
$$->elements = g_list_append ($$->elements, $2);
|
||||||
|
$$->current = $2;
|
||||||
|
while (l) {
|
||||||
|
((connection_t*) l->data)->sink = $$->current->name;
|
||||||
|
l = g_list_next (l);
|
||||||
|
}
|
||||||
|
if ($$->connections_pending) {
|
||||||
|
g_list_free ($$->connections_pending);
|
||||||
|
$$->connections_pending = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| graph bin { $$ = $1; $$->bins = g_list_append ($$->bins, $2); }
|
||||||
|
| graph connection { $$ = $1; $$->connections = g_list_append ($$->connections, $2);
|
||||||
|
if (!$2->src)
|
||||||
|
$2->src = $$->current->name;
|
||||||
|
if (!$2->sink)
|
||||||
|
$$->connections_pending = g_list_append ($$->connections_pending, $2);
|
||||||
|
}
|
||||||
|
| graph property_value { $$ = $1;
|
||||||
|
$$->current->property_values = g_list_append ($$->current->property_values,
|
||||||
|
$2);
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
bin: '{' graph '}'
|
bin: '{' graph '}' { $$ = $2; $$->current_bin_type = "gstthread"; }
|
||||||
| id '.' '(' graph ')'
|
| id '.' '(' graph ')' { $$ = $4; $$->current_bin_type = $1; }
|
||||||
;
|
;
|
||||||
|
|
||||||
connection: lconnection
|
connection: lconnection
|
||||||
| rconnection
|
| rconnection
|
||||||
| bconnection
|
| qconnection
|
||||||
|
| iconnection
|
||||||
;
|
;
|
||||||
|
|
||||||
lconnection: qid '+' '!'
|
lconnection: qid '+' '!' { $$ = g_new0 (connection_t, 1);
|
||||||
|
$$->src = $1->id1;
|
||||||
|
$$->src_pads = g_list_append ($$->src_pads, $1->id2);
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
rconnection: '!' '+' qid
|
rconnection: '!' '+' qid { $$ = g_new0 (connection_t, 1);
|
||||||
|
$$->sink = $3->id1;
|
||||||
|
$$->sink_pads = g_list_append ($$->src_pads, $3->id2);
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
bconnection: '!'
|
qconnection: qid '+' '!' '+' qid { $$ = g_new0 (connection_t, 1);
|
||||||
| qid '+' bconnection '+' qid
|
$$->src = $1->id1;
|
||||||
|
$$->src_pads = g_list_append ($$->src_pads, $1->id2);
|
||||||
|
$$->sink = $5->id1;
|
||||||
|
$$->sink_pads = g_list_append ($$->sink_pads, $5->id2);
|
||||||
|
}
|
||||||
|
;
|
||||||
|
|
||||||
|
iconnection: '!' { $$ = g_new0 (connection_t, 1); }
|
||||||
|
| id '+' iconnection '+' id
|
||||||
|
{ $$ = $3;
|
||||||
|
$$->src_pads = g_list_append ($$->src_pads, $1);
|
||||||
|
$$->sink_pads = g_list_append ($$->sink_pads, $5);
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
@ -89,5 +145,9 @@ int main (int argc, char **argv)
|
||||||
else
|
else
|
||||||
yyin = stdin;
|
yyin = stdin;
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
|
yydebug = 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
return yyparse();
|
return yyparse();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <glib.h>
|
#include "types.h"
|
||||||
#include <grammar.tab.h>
|
#include <grammar.tab.h>
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
|
38
gst/parse/types.h
Normal file
38
gst/parse/types.h
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
#include <glib-object.h>
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
gchar *name;
|
||||||
|
GList *property_values;
|
||||||
|
} element_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
gchar *name;
|
||||||
|
GType value_type;
|
||||||
|
union {
|
||||||
|
gdouble d;
|
||||||
|
gboolean b;
|
||||||
|
gint i;
|
||||||
|
gchar *s;
|
||||||
|
} value;
|
||||||
|
} property_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *src;
|
||||||
|
char *sink;
|
||||||
|
GList *src_pads;
|
||||||
|
GList *sink_pads;
|
||||||
|
} connection_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
element_t *current;
|
||||||
|
gchar *current_bin_type;
|
||||||
|
GList *elements;
|
||||||
|
GList *connections;
|
||||||
|
GList *connections_pending;
|
||||||
|
GList *bins;
|
||||||
|
} graph_t;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
gchar *id1;
|
||||||
|
gchar *id2;
|
||||||
|
} hash_t;
|
Loading…
Reference in a new issue