parse: add support for presets
authorStefan Sauer <ensonic@users.sf.net>
Tue, 30 Dec 2014 10:48:26 +0000 (11:48 +0100)
committerNicolas Dufresne <nicolas@ndufresne.ca>
Sat, 28 Dec 2019 04:02:16 +0000 (04:02 +0000)
Add new parse syntax: @preset="<preset-name>" to load presets.
Fixes #86

gst/parse/grammar.y.in
gst/parse/parse.l
tests/check/pipelines/parse-launch.c
tools/gst-launch-1.0.1

index 034232499fbdf3875bb6622f5d6cac6dda01def2..76b66f9be9f86737da2d0969c09310bb8ec6d13e 100644 (file)
@@ -456,6 +456,40 @@ error:
   goto out;
 }
 
+static void gst_parse_element_preset (gchar *value, GstElement *element, graph_t *graph)
+{
+  /* do nothing if preset is for missing element or its not a preset element */
+  if (element == NULL)
+    goto out;
+
+  if (!GST_IS_PRESET(element))
+    goto not_a_preset;
+
+  /* do nothing if no preset is given */
+  if (value == NULL || *value == '\0')
+    goto out;
+
+  gst_parse_unescape (value);
+  if (!gst_preset_load_preset (GST_PRESET (element), value))
+    goto error;
+
+out:
+  gst_parse_strfree (value);
+  return;
+
+not_a_preset:
+  SET_ERROR (graph->error, GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY,
+         _("Element \"%s\" is not a GstPreset"),
+        GST_ELEMENT_NAME (element));
+  goto out;
+
+error:
+  SET_ERROR (graph->error, GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY,
+         _("could not set preset \"%s\" in element \"%s\""),
+        value, GST_ELEMENT_NAME (element));
+  goto out;
+}
+
 static void gst_parse_free_reference (reference_t *rr)
 {
   if(rr->element) gst_object_unref(rr->element);
@@ -763,7 +797,7 @@ static int yyerror (void *scanner, graph_t *graph, const char *s);
 %token <ss> PARSE_URL
 %token <ss> IDENTIFIER
 %left  <ss> REF PADREF BINREF
-%token <ss> ASSIGNMENT
+%token <ss> ASSIGNMENT PRESET
 %token <ss> LINK
 %token <ss> LINK_ALL
 
@@ -817,6 +851,9 @@ element:    IDENTIFIER                    { $$ = gst_element_factory_make ($1, NULL);
                                                }
                                                gst_parse_strfree ($1);
                                               }
+       |       element PRESET            { gst_parse_element_preset ($2, $1, graph);
+                                               $$ = $1;
+                                             }
        |       element ASSIGNMENT            { gst_parse_element_set ($2, $1, graph);
                                                $$ = $1;
                                              }
index 50acf5cb6b6c4b1b5cf1cefa5f7cddca299badda..8d4e97eede81a0535318358f886897442845acc8 100644 (file)
@@ -64,6 +64,8 @@ _url ({_protocol}"://"{_string}|["."{_identifier}]?"/"{_string})|({_protocol}":/
 /* we must do this here, because nearly everything matches a {_string} */ 
 _assignment {_identifier}{_assign}{_string}
 
+_preset @preset{_assign}{_string}
+
 /* get pad/element references and stuff with dots right */
 _padref "."{_identifier}
 _ref {_identifier}"."{_identifier}?
@@ -94,6 +96,16 @@ _link ([!:][[:space:]]*{_caps}([[:space:]]*(";"[[:space:]]*{_caps})*[[:space:]]*
     return ASSIGNMENT;
 }
 
+{_preset} {
+    gchar *pos = yytext;
+    while (*pos && (*pos != '=')) pos++;
+    while (*pos && g_ascii_isspace (*pos)) pos++;
+    PRINT ("PRESET: %s", &pos[1]);
+    yylval->ss = gst_parse_strdup (&pos[1]);
+    BEGIN (INITIAL);
+    return PRESET;
+}
+
 {_padref} {
     yytext++;
     PRINT ("PADREF: %s", yytext);
index ae7cb1787e1aa89ad628f3ed41864b4150fefb8c..b732da0331a58f72a67aa659e48129ee92ae6a7c 100644 (file)
@@ -670,6 +670,24 @@ GST_START_TEST (test_missing_elements)
 
 GST_END_TEST;
 
+GST_START_TEST (test_preset)
+{
+  GstElement *element;
+  GError *err = NULL;
+
+  /* missing preset */
+  element =
+      gst_parse_launch
+      ("fakesrc ! identity @preset=\"Wrong preset\" ! fakesink", &err);
+  fail_unless (err != NULL, "expected error");
+  fail_unless_equals_int (err->code, GST_PARSE_ERROR_COULD_NOT_SET_PROPERTY);
+  fail_unless (element != NULL, "Doesn't NULL return without FATAL_ERRORS");
+  gst_clear_object (&element);
+  g_clear_error (&err);
+}
+
+GST_END_TEST;
+
 GST_START_TEST (test_flags)
 {
   GstElement *element;
@@ -734,6 +752,7 @@ parse_suite (void)
   tcase_add_test (tc_chain, test_flags);
   tcase_add_test (tc_chain, test_missing_elements);
   tcase_add_test (tc_chain, test_parsing);
+  tcase_add_test (tc_chain, test_preset);
   return s;
 }
 
index bd3b733810b3370a3d6d74caa9f6958f1afe712b..19f05bfb1286faed4588ae8eb69c00d486e32560 100644 (file)
@@ -10,7 +10,8 @@ gst\-launch\-1.0 \- build and run a GStreamer pipeline
 
 In simple form, a PIPELINE\-DESCRIPTION is a list of
 elements separated by exclamation marks (!). Properties may be appended to
-elements, in the form \fIproperty=value\fR.
+elements, in the form \fIproperty=value\fR. A "preset" can also be set using
+the \fI@preset=<preset name>\fR synthax.
 
 For a complete description of possible PIPELINE-DESCRIPTIONS see the section
 \fIpipeline description\fR below or consult the GStreamer documentation.
@@ -159,6 +160,13 @@ find out about properties and allowed values of different elements.
 .br
 Enumeration properties can be set by name, nick or value.
 
+.B Presets
+
+@preset=<preset name> ...
+
+Sets the preset on the element. you can use \fbgst\-inspect\-1.0\fr(1) to
+find out what presets are available for a specific element.
+
 .B Bins
 
 \fI[BINTYPE.]\fR ( \fI[PROPERTY1 ...]\fR PIPELINE-DESCRIPTION )