gstreamer/markdown/tutorials/basic/handy-elements.md
2018-11-25 16:33:11 +00:00

12 KiB

Basic tutorial 14: Handy elements

Goal

This tutorial gives a list of handy GStreamer elements that are worth knowing. They range from powerful all-in-one elements that allow you to build complex pipelines easily (like playbin), to little helper elements which are extremely useful when debugging.

For simplicity, the following examples are given using the gst-launch-1.0 tool (Learn about it in ). Use the -v command line parameter if you want to see the Pad Caps that are being negotiated.

Bins

These are Bin elements which you treat as a single element and they take care of instantiating all the necessary internal pipeline to accomplish their task.

playbin

This element has been extensively used throughout the tutorials. It manages all aspects of media playback, from source to display, passing through demuxing and decoding. It is so flexible and has so many options that a whole set of tutorials are devoted to it. See the for more details.

uridecodebin

This element decodes data from a URI into raw media. It selects a source element that can handle the given URI scheme and connects it to a decodebin element. It acts like a demuxer, so it offers as many source pads as streams are found in the media.

gst-launch-1.0 uridecodebin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! videoconvert ! autovideosink
gst-launch-1.0 uridecodebin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! audioconvert ! autoaudiosink

decodebin

This element automatically constructs a decoding pipeline using available decoders and demuxers via auto-plugging until raw media is obtained. It is used internally by uridecodebin which is often more convenient to use, as it creates a suitable source element as well. It replaces the old decodebin element. It acts like a demuxer, so it offers as many source pads as streams are found in the media.

gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! decodebin ! autovideosink

File input/output

filesrc

This element reads a local file and produces media with ANY Caps. If you want to obtain the correct Caps for the media, explore the stream by using a typefind element or by setting the typefind property of filesrc to TRUE.

gst-launch-1.0 filesrc location=f:\\media\\sintel\\sintel_trailer-480p.webm ! decodebin ! autovideosink

filesink

This element writes to a file all the media it receives. Use the location property to specify the file name.

gst-launch-1.0 audiotestsrc ! vorbisenc ! oggmux ! filesink location=test.ogg

Network

souphttpsrc

This element receives data as a client over the network via HTTP using the libsoup library. Set the URL to retrieve through the location property.

gst-launch-1.0 souphttpsrc location=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! decodebin ! autovideosink

Test media generation

These elements are very useful to check if other parts of the pipeline are working, by replacing the source by one of these test sources which are “guaranteed” to work.

videotestsrc

This element produces a video pattern (selectable among many different options with the pattern property). Use it to test video pipelines.

gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

audiotestsrc

This element produces an audio wave (selectable among many different options with the wave property). Use it to test video pipelines.

gst-launch-1.0 audiotestsrc ! audioconvert ! autoaudiosink

Video adapters

videoconvert

This element converts from one color space (e.g. RGB) to another one (e.g. YUV). It can also convert between different YUV formats (e.g. I420, NV12, YUY2 …) or RGB format arrangements (e.g. RGBA, ARGB, BGRA…).

This is normally your first choice when solving negotiation problems. When not needed, because its upstream and downstream elements can already understand each other, it acts in pass-through mode having minimal impact on the performance.

As a rule of thumb, always use videoconvert whenever you use elements whose Caps are unknown at design time, like autovideosink, or that can vary depending on external factors, like decoding a user-provided file.

gst-launch-1.0 videotestsrc ! videoconvert ! autovideosink

videorate

This element takes an incoming stream of time-stamped video frames and produces a stream that matches the source pad's frame rate. The correction is performed by dropping and duplicating frames, no fancy algorithm is used to interpolate frames.

This is useful to allow elements requiring different frame rates to link. As with the other adapters, if it is not needed (because there is a frame rate on which both Pads can agree), it acts in pass-through mode and does not impact performance.

It is therefore a good idea to always use it whenever the actual frame rate is unknown at design time, just in case.

gst-launch-1.0 videotestsrc ! video/x-raw,framerate=30/1 ! videorate ! video/x-raw,framerate=1/1 ! videoconvert ! autovideosink

videoscale

This element resizes video frames. By default the element tries to negotiate to the same size on the source and sink Pads so that no scaling is needed. It is therefore safe to insert this element in a pipeline to get more robust behavior without any cost if no scaling is needed.

This element supports a wide range of color spaces including various YUV and RGB formats and is therefore generally able to operate anywhere in a pipeline.

If the video is to be output to a window whose size is controlled by the user, it is a good idea to use a videoscale element, since not all video sinks are capable of performing scaling operations.

gst-launch-1.0 uridecodebin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! videoscale ! video/x-raw,width=178,height=100 ! videoconvert ! autovideosink

Audio adapters

audioconvert

This element converts raw audio buffers between various possible formats. It supports integer to float conversion, width/depth conversion, signedness and endianness conversion and channel transformations.

Like videoconvert does for video, you use this to solve negotiation problems with audio, and it is generally safe to use it liberally, since this element does nothing if it is not needed.

gst-launch-1.0 audiotestsrc ! audioconvert ! autoaudiosink

audioresample

This element resamples raw audio buffers to different sampling rates using a configurable windowing function to enhance quality

Again, use it to solve negotiation problems regarding sampling rates and do not fear to use it generously.

gst-launch-1.0 uridecodebin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm ! audioresample ! audio/x-raw-float,rate=4000 ! audioconvert ! autoaudiosink

audiorate

This element takes an incoming stream of time-stamped raw audio frames and produces a perfect stream by inserting or dropping samples as needed. It does not allow the sample rate to be changed as videorate does, it just fills gaps and removes overlapped samples so the output stream is continuous and “clean”.

It is useful in situations where the timestamps are going to be lost (when storing into certain file formats, for example) and the receiver will require all samples to be present. It is cumbersome to exemplify this, so no example is given.

Warning Most of the time, audiorate is not what you want.

Multithreading

queue

Queues have been explained in . Basically, a queue performs two tasks:

  • Data is queued until a selected limit is reached. Any attempt to push more buffers into the queue blocks the pushing thread until more space becomes available.
  • The queue creates a new thread on the source Pad to decouple the processing on sink and source Pads.

Additionally, queue triggers signals when it is about to become empty or full (according to some configurable thresholds), and can be instructed to drop buffers instead of blocking when it is full.

As a rule of thumb, prefer the simpler queue element over queue2 whenever network buffering is not a concern to you. See for an example.

queue2

This element is not an evolution of queue. It has the same design goals but follows a different implementation approach, which results in different features. Unfortunately, it is often not easy to tell which queue is the best choice.

queue2 performs the two tasks listed above for queue, and, additionally, is able to store the received data (or part of it) on a disk file, for later retrieval. It also replaces the signals with the more general and convenient buffering messages described in .

As a rule of thumb, prefer queue2 over queue whenever network buffering is a concern to you. See for an example (queue2 is hidden inside playbin).

multiqueue

This element provides queues for multiple streams simultaneously, and eases their management, by allowing some queues to grow if no data is being received on other streams, or by allowing some queues to drop data if they are not connected to anything (instead of returning an error, as a simpler queue would do). Additionally, it synchronizes the different streams, ensuring that none of them goes too far ahead of the others.

This is an advanced element. It is found inside decodebin, but you will rarely need to instantiate it yourself in a normal playback application.

tee

already showed how to use a tee element, which splits data to multiple pads. Splitting the data flow is useful, for example, when capturing a video where the video is shown on the screen and also encoded and written to a file. Another example is playing music and hooking up a visualization module.

One needs to use separate queue elements in each branch to provide separate threads for each branch. Otherwise a blocked dataflow in one branch would stall the other branches.

gst-launch-1.0 audiotestsrc ! tee name=t ! queue ! audioconvert ! autoaudiosink t. ! queue ! wavescope ! videoconvert ! autovideosink

Capabilities

capsfilter

already explained how to use Caps filters with gst-launch-1.0. When building a pipeline programmatically, Caps filters are implemented with the capsfilter element. This element does not modify data as such, but enforces limitations on the data format.

gst-launch-1.0 videotestsrc ! video/x-raw, format=GRAY8 ! videoconvert ! autovideosink

typefind

This element determines the type of media a stream contains. It applies typefind functions in the order of their rank. Once the type has been detected it sets its source Pad Caps to the found media type and emits the have-type signal.

It is instantiated internally by decodebin, and you can use it too to find the media type, although you can normally use the GstDiscoverer which provides more information (as seen in ).

Debugging

fakesink

This sink element simply swallows any data fed to it. It is useful when debugging, to replace your normal sinks and rule them out of the equation. It can be very verbose when combined with the -v switch of gst-launch-1.0, so use the silent property to remove any unwanted noise.

gst-launch-1.0 audiotestsrc num-buffers=1000 ! fakesink sync=false

identity

This is a dummy element that passes incoming data through unmodified. It has several useful diagnostic functions, such as offset and timestamp checking, or buffer dropping. Read its documentation to learn all the things this seemingly harmless element can do.

gst-launch-1.0 audiotestsrc ! identity drop-probability=0.1 ! audioconvert ! autoaudiosink

Conclusion

This tutorial has listed a few elements which are worth knowing, due to their usefulness in the day-to-day work with GStreamer. Some are valuable for production pipelines, whereas others are only needed for debugging purposes.

It has been a pleasure having you here, and see you soon!