From 5b7b68a015e1024d4208078a47b14be792aee965 Mon Sep 17 00:00:00 2001 From: Brian Matherly Date: Sun, 24 Jul 2011 14:36:19 -0500 Subject: [PATCH] Add service metadata for composite transition, all normalizing filters (resample, resize, rescale), and the loader producer. Add yml validation rule to Makefile. All yml files pass validation against metaschema.yaml. --- Makefile | 6 + src/modules/avformat/consumer_avformat.yml | 2 +- src/modules/avformat/producer_avformat.yml | 2 +- src/modules/core/factory.c | 76 +++++-------- src/modules/core/filter_channelcopy.yml | 4 +- src/modules/core/filter_gamma.yml | 4 +- src/modules/core/filter_luma.yml | 2 +- src/modules/core/filter_region.yml | 5 +- src/modules/core/filter_rescale.yml | 26 +++++ src/modules/core/filter_resize.yml | 33 ++++++ src/modules/core/producer_loader.yml | 32 ++++++ src/modules/core/transition_composite.yml | 126 +++++++++++++++++++++ src/modules/core/transition_luma.yml | 2 +- src/modules/dv/producer_libdv.yml | 2 +- src/modules/gtk2/factory.c | 1 + src/modules/gtk2/filter_rescale.yml | 36 ++++++ src/modules/gtk2/producer_pango.yml | 12 +- src/modules/kdenlive/filter_boxblur.yml | 2 +- src/modules/resample/Makefile | 2 + src/modules/resample/factory.c | 10 ++ src/modules/resample/filter_resample.yml | 29 +++++ 21 files changed, 350 insertions(+), 64 deletions(-) create mode 100644 src/modules/core/filter_rescale.yml create mode 100644 src/modules/core/filter_resize.yml create mode 100644 src/modules/core/producer_loader.yml create mode 100644 src/modules/gtk2/filter_rescale.yml create mode 100644 src/modules/resample/filter_resample.yml diff --git a/Makefile b/Makefile index 136171b1..a2025c5e 100644 --- a/Makefile +++ b/Makefile @@ -51,3 +51,9 @@ uninstall: dist: git archive --format=tar --prefix=mlt-$(version)/ v$(version) | gzip >mlt-$(version).tar.gz + +validate-yml: + for file in `find ./ -type f -name \*.yml`; do \ + echo "validate: $$file"; \ + kwalify -f src/framework/metaschema.yaml $$file; \ + done diff --git a/src/modules/avformat/consumer_avformat.yml b/src/modules/avformat/consumer_avformat.yml index 4d52cd52..317f821f 100644 --- a/src/modules/avformat/consumer_avformat.yml +++ b/src/modules/avformat/consumer_avformat.yml @@ -37,7 +37,7 @@ parameters: This option allows other services to encapsulate the avformat consumer and do something different (not already available in a protocol) with its output by listening to the avformat-write event. - type; integer + type: integer minimum: 0 maximum: 1 default: 0 diff --git a/src/modules/avformat/producer_avformat.yml b/src/modules/avformat/producer_avformat.yml index 1532f19e..459a5900 100644 --- a/src/modules/avformat/producer_avformat.yml +++ b/src/modules/avformat/producer_avformat.yml @@ -153,7 +153,7 @@ parameters: maximum: 1 widget: checkbox - - identifer: force_colorspace + - identifier: force_colorspace title: Force colorspace description: When provided, this overrides the detected colorspace of the video (Y'CbCr only). type: integer diff --git a/src/modules/core/factory.c b/src/modules/core/factory.c index 5cb45504..1e7d500a 100644 --- a/src/modules/core/factory.c +++ b/src/modules/core/factory.c @@ -58,28 +58,7 @@ extern mlt_transition transition_mix_init( mlt_profile profile, mlt_service_type static mlt_properties metadata( mlt_service_type type, const char *id, void *data ) { char file[ PATH_MAX ]; - const char *service_type = NULL; - switch ( type ) - { - case filter_type: - service_type = "filter"; - break; - case producer_type: - service_type = "producer"; - break; - case transition_type: - service_type = "transition"; - break; - default: - return NULL; - } - if ( !strcmp( id, "grayscale" ) ) - id = "greyscale"; - else if ( !strcmp( id, "color" ) ) - id = "colour"; - else if ( !strcmp( id, "channelswap" ) ) - id = "channelcopy"; - snprintf( file, PATH_MAX, "%s/core/%s_%s.yml", mlt_environment( "MLT_DATA" ), service_type, id ); + snprintf( file, PATH_MAX, "%s/core/%s", mlt_environment( "MLT_DATA" ), (char*) data ); return mlt_properties_parse_yaml( file ); } @@ -122,29 +101,32 @@ MLT_REPOSITORY MLT_REGISTER( transition_type, "mix", transition_mix_init ); MLT_REGISTER( transition_type, "region", transition_region_init ); - MLT_REGISTER_METADATA( filter_type, "audiowave", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "brightness", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "channelcopy", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "channelswap", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "crop", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "data_show", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "gamma", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "greyscale", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "grayscale", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "luma", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "mirror", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "mono", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "obscure", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "region", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "transition", metadata, NULL ); - MLT_REGISTER_METADATA( filter_type, "watermark", metadata, NULL ); - MLT_REGISTER_METADATA( producer_type, "colour", metadata, NULL ); - MLT_REGISTER_METADATA( producer_type, "color", metadata, NULL ); - MLT_REGISTER_METADATA( producer_type, "consumer", metadata, NULL ); - MLT_REGISTER_METADATA( producer_type, "hold", metadata, NULL ); - MLT_REGISTER_METADATA( producer_type, "noise", metadata, NULL ); - MLT_REGISTER_METADATA( transition_type, "composite", metadata, NULL ); - MLT_REGISTER_METADATA( transition_type, "luma", metadata, NULL ); - MLT_REGISTER_METADATA( transition_type, "mix", metadata, NULL ); - MLT_REGISTER_METADATA( transition_type, "region", metadata, NULL ); + MLT_REGISTER_METADATA( filter_type, "audiowave", metadata, "filter_audiowave.yml" ); + MLT_REGISTER_METADATA( filter_type, "brightness", metadata, "filter_brightness.yml" ); + MLT_REGISTER_METADATA( filter_type, "channelcopy", metadata, "filter_channelcopy.yml" ); + MLT_REGISTER_METADATA( filter_type, "channelswap", metadata, "filter_channelcopy.yml" ); + MLT_REGISTER_METADATA( filter_type, "crop", metadata, "filter_crop.yml" ); + MLT_REGISTER_METADATA( filter_type, "data_show", metadata, "filter_data_show.yml" ); + MLT_REGISTER_METADATA( filter_type, "gamma", metadata, "filter_gamma.yml" ); + MLT_REGISTER_METADATA( filter_type, "greyscale", metadata, "filter_greyscale.yml" ); + MLT_REGISTER_METADATA( filter_type, "grayscale", metadata, "filter_greyscale.yml" ); + MLT_REGISTER_METADATA( filter_type, "luma", metadata, "filter_luma.yml" ); + MLT_REGISTER_METADATA( filter_type, "mirror", metadata, "filter_mirror.yml" ); + MLT_REGISTER_METADATA( filter_type, "mono", metadata, "filter_mono.yml" ); + MLT_REGISTER_METADATA( filter_type, "obscure", metadata, "filter_obscure.yml" ); + MLT_REGISTER_METADATA( filter_type, "region", metadata, "filter_region.yml" ); + MLT_REGISTER_METADATA( filter_type, "rescale", metadata, "filter_rescale.yml" ); + MLT_REGISTER_METADATA( filter_type, "resize", metadata, "filter_resize.yml" ); + MLT_REGISTER_METADATA( filter_type, "transition", metadata, "filter_transition.yml" ); + MLT_REGISTER_METADATA( filter_type, "watermark", metadata, "filter_watermark.yml" ); + MLT_REGISTER_METADATA( producer_type, "colour", metadata, "producer_colour.yml" ); + MLT_REGISTER_METADATA( producer_type, "color", metadata, "producer_colour.yml" ); + MLT_REGISTER_METADATA( producer_type, "consumer", metadata, "producer_consumer.yml" ); + MLT_REGISTER_METADATA( producer_type, "loader", metadata, "producer_loader.yml" ); + MLT_REGISTER_METADATA( producer_type, "hold", metadata, "producer_hold.yml" ); + MLT_REGISTER_METADATA( producer_type, "noise", metadata, "producer_noise.yml" ); + MLT_REGISTER_METADATA( transition_type, "composite", metadata, "transition_composite.yml" ); + MLT_REGISTER_METADATA( transition_type, "luma", metadata, "transition_luma.yml" ); + MLT_REGISTER_METADATA( transition_type, "mix", metadata, "transition_mix.yml" ); + MLT_REGISTER_METADATA( transition_type, "region", metadata, "transition_region.yml" ); } diff --git a/src/modules/core/filter_channelcopy.yml b/src/modules/core/filter_channelcopy.yml index 0a4da212..e6c251be 100644 --- a/src/modules/core/filter_channelcopy.yml +++ b/src/modules/core/filter_channelcopy.yml @@ -7,9 +7,9 @@ copyright: Ushodaya Enterprises Limited creator: Dan Dennedy license: LGPLv2.1 language: en -description: Copy one audio channel to another. tags: - Audio +description: Copy one audio channel to another. parameters: - identifier: argument title: To @@ -23,7 +23,7 @@ parameters: minimum: 0 maximum: 15 default: 1 - - identifer: from + - identifier: from title: From type: integer minimum: 0 diff --git a/src/modules/core/filter_gamma.yml b/src/modules/core/filter_gamma.yml index d3b0e0b3..172759e5 100644 --- a/src/modules/core/filter_gamma.yml +++ b/src/modules/core/filter_gamma.yml @@ -13,12 +13,12 @@ description: Adjust image luma using a non-linear power-law curve. parameters: - identifier: argument title: Gamma - type: double + type: float description: The exponential factor of the power-law curve default: 1.0 - identifier: gamma title: Gamma - type: double + type: float description: See "argument" mutable: yes default: 1.0 diff --git a/src/modules/core/filter_luma.yml b/src/modules/core/filter_luma.yml index faafde5f..67beca4a 100644 --- a/src/modules/core/filter_luma.yml +++ b/src/modules/core/filter_luma.yml @@ -25,7 +25,7 @@ parameters: results set this to a multiple of ttl used in pixbuf. mutable: yes default: 25 - - identifer: duration + - identifier: duration title: Duration type: integer description: The length of the transition. diff --git a/src/modules/core/filter_region.yml b/src/modules/core/filter_region.yml index 0d901b6c..82a14c5e 100644 --- a/src/modules/core/filter_region.yml +++ b/src/modules/core/filter_region.yml @@ -12,7 +12,8 @@ tags: description: > Apply one or more filters to a region of the video image. The region can be shaped as well using the alpha channel of another producer. -bugs: "circle" is unpredictable in the absence of the librsvg pixbuf loader. +bugs: + - Circle is unpredictable in the absence of the librsvg pixbuf loader. parameters: - identifier: argument title: File @@ -24,5 +25,5 @@ parameters: - identifier: region.* title: Region description: > - Properties may be set on the encapsulated region transition.See "region" + Properties may be set on the encapsulated region transition. See "region" transition for details. diff --git a/src/modules/core/filter_rescale.yml b/src/modules/core/filter_rescale.yml new file mode 100644 index 00000000..28324114 --- /dev/null +++ b/src/modules/core/filter_rescale.yml @@ -0,0 +1,26 @@ +schema_version: 0.1 +type: filter +identifier: rescale +title: Rescale +version: 1 +copyright: Ushodaya Enterprises Limited +creator: Dan Dennedy +license: LGPLv2.1 +language: en +tags: + - Video + - Hidden +description: > + Scale the producer video frame size to match the consumer. This filter is + designed for use as a normaliser for the loader producer. +notes: > + If a property "consumer_aspect_ratio" exists on the frame, then rescaler + normalises the producer's aspect ratio and maximises the size of the frame, + but may not produce the consumer's requested dimension. Therefore, this + option works best in conjunction with the resize filter. This behavior can be + disabled by another service by either removing the property, setting it to + zero, or setting frame property "distort" to 1. +bugs: + - > + It only implements a nearest neighbour scaling - it is used as the base + class for the gtkrescale and mcrescale filters. diff --git a/src/modules/core/filter_resize.yml b/src/modules/core/filter_resize.yml new file mode 100644 index 00000000..a99444e6 --- /dev/null +++ b/src/modules/core/filter_resize.yml @@ -0,0 +1,33 @@ +schema_version: 0.1 +type: filter +identifier: resize +title: Resize +version: 1 +copyright: Ushodaya Enterprises Limited +creator: Charles Yates +license: LGPLv2.1 +language: en +tags: + - Video + - Hidden +description: > + Image scaling and padding and field order adjustment. +notes: > + Normally resize is used to pad the producer's output to what the consumer has + requested after an upstream rescale filter first scales the image to maximise + usage of the image area. This filter also adjusts the field order to lower + field first if the frame property "top_field_first" has been set to 1. + Therefore, when done, it sets the top_field_first to 0. This filter is + automatically invoked by the loader as part of image sample aspect ratio + normalisation. +bugs: + - Assumes lower field first output. +parameters: + - identifier: argument + title: Scale + type: string + description: The scaling method. + values: + - affine + required: no + readonly: no diff --git a/src/modules/core/producer_loader.yml b/src/modules/core/producer_loader.yml new file mode 100644 index 00000000..055bc31f --- /dev/null +++ b/src/modules/core/producer_loader.yml @@ -0,0 +1,32 @@ +schema_version: 0.1 +type: producer +identifier: loader +title: Loader +version: 1 +copyright: Ushodaya Enterprises Limited +creator: Charles Yates +license: LGPLv2.1 +language: en +tags: + - Audio + - Video + - Hidden +description: > + This producer has two roles: + + 1. it handles the mappings of all file names to the other producers; + + 2. it attaches normalising filters (rescale, resize and resample) to the + producers (when necessary). + + This producer simplifies many aspects of use. Essentially, it ensures that a + consumer will receive images and audio precisely as they request them. +parameters: + - identifier: argument + title: File/URL + type: string + description: The file for the producer to be based on. + required: no + readonly: no + default: unset + widget: fileopen \ No newline at end of file diff --git a/src/modules/core/transition_composite.yml b/src/modules/core/transition_composite.yml index 1e30de06..055935be 100644 --- a/src/modules/core/transition_composite.yml +++ b/src/modules/core/transition_composite.yml @@ -9,3 +9,129 @@ license: LGPLv2.1 language: en tags: - Video +description: > + A key-framable alpha-channel compositor for two frames. +notes: > + Performs dissolves and luma wipes in addition to alpha compositing. + + By default, the aspect ratio of the B frame is respected and the size + portion of the geometry specification simply defines a bounding rectangle. + + This performs field-based rendering unless the A frame property + "progressive" or "consumer_progressive" or the transition property + "progressive" is set to 1. +bugs: + - Assumes lower field first during field rendering. +parameters: + - identifier: factory + title: Factory + type: string + description: > + The name of a factory service used as a non-PGM producer loader. + default: loader + - identifier: geometry + title: Geometry + type: geometry + description: > + Key frame specification. This is a ";" delimited form of the deprecated + start, key[n], end properties. + mutable: yes + - identifier: progressive + title: Progressive + description: > + Enable or disable field-based rendering. + type: integer + minimum: 0 + maximum: 1 + mutable: yes + widget: checkbox + - identifier: distort + title: Allow distorted scaling + description: > + When set, causes the B frame image to fill the WxH completely with no + regard to B's aspect ratio. + type: integer + default: 0 + minimum: 0 + maximum: 1 + mutable: yes + widget: checkbox + - identifier: halign + title: Horizontal alignment + description: > + When not distorting, set the horizontal alignment of B within the + geometry rectangle. + type: string + default: left + values: + - left + - centre + - right + mutable: yes + widget: combo + - identifier: valign + title: Vertical alignment + description: > + When not distorting, set the vertical alignment of B within the + geometry rectangle. + type: string + default: top + values: + - top + - middle + - bottom + mutable: yes + widget: combo + - identifier: luma + title: Luma map + description: > + The luma map file name. If not supplied, a dissolve. + type: string + default: unset + mutable: yes + widget: fileopen + - identifier: softness + title: Softness + description: > + Only when using a luma map, how soft to make the edges between A and B. + type: float + default: 0.0 + minimum: 0.0 + maximum: 1.0 + mutable: yes + - identifier: luma.* + title: Luma producer + description: > + Properties may be set on the encapsulated producer. Any property starting + with "luma." is passed to the non-PGM luma producer. + readonly: no + mutable: yes + - identifier: start + title: Start geometry + description: > + A geometry specification as X/Y:WxH[!][:mix] + + X, Y, W, H are assumed to pixel units unless they have the suffix '%'. + + '!' is a shortcut to specify distort. + + Mix is always a 2 digit percentage, defaults to 100. + type: geometry + default: "85%/5%:10%x10%" + readonly: no + mutable: yes + - identifier: end + title: End geometry + description: > + X/Y:WxH[:mix] - The end geometry specification (see "start"). + type: geometry + readonly: no + mutable: yes + - identifier: key[F] + title: Key frame geometry + description: > + X/Y:WxH[:mix] - set a key frame for geometry between the in and out. F is + a frame number and can be negative to make it relative to the out point. + type: geometry + readonly: no + mutable: yes diff --git a/src/modules/core/transition_luma.yml b/src/modules/core/transition_luma.yml index 5b084c94..73308355 100644 --- a/src/modules/core/transition_luma.yml +++ b/src/modules/core/transition_luma.yml @@ -42,7 +42,7 @@ parameters: 0.0 = no softness. 1.0 = too soft. - identifier: reverse title: Reverse - type: int + type: integer mutable: yes description: > Reverse the direction of the transition. diff --git a/src/modules/dv/producer_libdv.yml b/src/modules/dv/producer_libdv.yml index 87890535..08323710 100644 --- a/src/modules/dv/producer_libdv.yml +++ b/src/modules/dv/producer_libdv.yml @@ -25,5 +25,5 @@ parameters: description: One of "best," "fast" or anything else chooses medium. readonly: no mutable: yes - widget: combobox + widget: combo default: best diff --git a/src/modules/gtk2/factory.c b/src/modules/gtk2/factory.c index f97bf816..fa98b22e 100644 --- a/src/modules/gtk2/factory.c +++ b/src/modules/gtk2/factory.c @@ -88,6 +88,7 @@ MLT_REPOSITORY MLT_REGISTER( producer_type, "pixbuf", create_service ); MLT_REGISTER_METADATA( consumer_type, "gtk2_preview", metadata, "consumer_gtk2_preview.yml" ); + MLT_REGISTER_METADATA( filter_type, "gtkrescale", metadata, "filter_rescale.yml" ); MLT_REGISTER_METADATA( producer_type, "pango", metadata, "producer_pango.yml" ); MLT_REGISTER_METADATA( producer_type, "pixbuf", metadata, "producer_pixbuf.yml" ); } diff --git a/src/modules/gtk2/filter_rescale.yml b/src/modules/gtk2/filter_rescale.yml new file mode 100644 index 00000000..18aed7cd --- /dev/null +++ b/src/modules/gtk2/filter_rescale.yml @@ -0,0 +1,36 @@ +schema_version: 0.1 +type: filter +identifier: gtkrescale +title: Gtk Rescale +version: 1 +copyright: Ushodaya Enterprises Limited +creator: Dan Dennedy +license: LGPLv2.1 +language: en +tags: + - Video + - Hidden +description: > + Scale the producer video frame size to match the consumer. This filter is + designed for use as a normaliser for the loader producer. +notes: > + If a property "consumer_aspect_ratio" exists on the frame, then rescaler + normalises the producer's aspect ratio and maximises the size of the frame, + but may not produce the consumer's requested dimension. Therefore, this + option works best in conjunction with the resize filter. This behavior can be + disabled by another service by either removing the property, setting it to + zero, or setting frame property "distort" to 1. +parameters: + - identifier: argument + title: Interpolation + type: string + description: The rescaling method. + values: + - nearest (lowest quality, fastest) + - tiles + - bilinear (good quality, moderate speed) + - hyper (best quality, slowest) + required: no + readonly: no + default: bilinear + widget: combo diff --git a/src/modules/gtk2/producer_pango.yml b/src/modules/gtk2/producer_pango.yml index c1f04cc1..b63982d9 100644 --- a/src/modules/gtk2/producer_pango.yml +++ b/src/modules/gtk2/producer_pango.yml @@ -73,7 +73,7 @@ parameters: left, centre, right (also, numbers 0, 1 and 2 can be used respectively) readonly: no mutable: yes - widget: combobox + widget: combo - identifier: pad title: Padding @@ -98,11 +98,13 @@ parameters: - identifier: font title: Font type: string - description: The default typeface to use when not using markup. - default: "Sans 48". FreeType2 renders at 72 dpi. + description: > + The default typeface to use when not using markup. + FreeType2 renders at 72 dpi. + default: Sans 48 readonly: no mutable: yes - widget: combobox + widget: combo - identifier: weight title: Font weight @@ -122,7 +124,7 @@ parameters: default: UTF-8 readonly: no mutable: yes - widget: combobox + widget: combo - identifier: real_width title: Real width diff --git a/src/modules/kdenlive/filter_boxblur.yml b/src/modules/kdenlive/filter_boxblur.yml index 5a5f761f..5c5a4e95 100644 --- a/src/modules/kdenlive/filter_boxblur.yml +++ b/src/modules/kdenlive/filter_boxblur.yml @@ -1,6 +1,6 @@ schema_version: 0.1 type: filter -identifier:boxblur +identifier: boxblur title: Box Blur version: 1 copyright: Leny Grisel, Jean-Baptiste Mardelle diff --git a/src/modules/resample/Makefile b/src/modules/resample/Makefile index 009e3479..f2e81781 100644 --- a/src/modules/resample/Makefile +++ b/src/modules/resample/Makefile @@ -31,6 +31,8 @@ clean: install: all install -m 755 $(TARGET) "$(DESTDIR)$(libdir)/mlt" + install -d "$(DESTDIR)$(datadir)/mlt/resample" + install -m 644 *.yml "$(DESTDIR)$(datadir)/mlt/resample" ifneq ($(wildcard .depend),) include .depend diff --git a/src/modules/resample/factory.c b/src/modules/resample/factory.c index c61ec516..e4287a62 100644 --- a/src/modules/resample/factory.c +++ b/src/modules/resample/factory.c @@ -19,11 +19,21 @@ */ #include +#include #include extern mlt_filter filter_resample_init( mlt_profile profile, mlt_service_type type, const char *id, char *arg ); +static mlt_properties metadata( mlt_service_type type, const char *id, void *data ) +{ + char file[ PATH_MAX ]; + snprintf( file, PATH_MAX, "%s/resample/%s", mlt_environment( "MLT_DATA" ), (char*) data ); + return mlt_properties_parse_yaml( file ); +} + MLT_REPOSITORY { MLT_REGISTER( filter_type, "resample", filter_resample_init ); + + MLT_REGISTER_METADATA( filter_type, "resample", metadata, "filter_resample.yml" ); } diff --git a/src/modules/resample/filter_resample.yml b/src/modules/resample/filter_resample.yml new file mode 100644 index 00000000..00a0d0ba --- /dev/null +++ b/src/modules/resample/filter_resample.yml @@ -0,0 +1,29 @@ +schema_version: 0.1 +type: filter +identifier: resample +title: Resample +version: 1 +copyright: Ushodaya Enterprises Limited +creator: Dan Dennedy +license: LGPLv2.1 +language: en +tags: + - Audio + - Hidden +description: > + Adjust an audio stream's sampling rate, and duplicate channels if producer + provides less than consumer requested. + + This filter is automatically invoked by the loader producer for the sake of + normalisation over inputs and with the consumer. +bugs: + - > + Assumes 2 channels during libsamplerate initialisation. Untested with >2 + channels. +parameters: + - identifier: argument + title: Frequency + type: integer + description: The target sample rate. + required: no + readonly: no -- 2.39.2