# 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 `playbin2`), 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 [Basic tutorial 10: GStreamer tools](Basic%2Btutorial%2B10%253A%2BGStreamer%2Btools.html)). 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. ### `playbin2` 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 [Playback tutorials](Playback%2Btutorials.html) 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 `decodebin2` element. It acts like a demuxer, so it offers as many source pads as streams are found in the media. ``` lang=bash gst-launch-1.0 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! ffmpegcolorspace ! autovideosink ``` ``` lang=bash gst-launch-1.0 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! audioconvert ! autoaudiosink ``` ### `decodebin2` 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. ``` lang=bash gst-launch-1.0 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! decodebin2 ! 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`. ``` lang=c gst-launch-1.0 filesrc location=f:\\media\\sintel\\sintel_trailer-480p.webm ! decodebin2 ! 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 SOUP library. Set the URL to retrieve through the `location` property. ``` lang=bash gst-launch-1.0 souphttpsrc location=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! decodebin2 ! 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. ``` lang=bash gst-launch-1.0 videotestsrc ! ffmpegcolorspace ! autovideosink ``` ### `audiotestsrc` This element produces an audio wave (selectable among many different options with the `wave` property). Use it to test video pipelines. ``` lang=bash gst-launch-1.0 audiotestsrc ! audioconvert ! autoaudiosink ``` # Video adapters ### `ffmpegcolorspace` 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 `ffmpegcolorspace` 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. ``` lang=bash gst-launch-1.0 videotestsrc ! ffmpegcolorspace ! 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. ``` lang=c gst-launch-1.0 videotestsrc ! video/x-raw-rgb,framerate=30/1 ! videorate ! video/x-raw-rgb,framerate=1/1 ! ffmpegcolorspace ! 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. ``` lang=bash gst-launch-1.0 uridecodebin uri=http://docs.gstreamer.com/media/sintel_trailer-480p.webm ! videoscale ! video/x-raw-yuv,width=178,height=100 ! ffmpegcolorspace ! 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 `ffmpegcolorspace` 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. ``` lang=bash 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. ``` lang=bash gst-launch-1.0 uridecodebin uri=http://docs.gstreamer.com/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. # Multithreading ### `queue` Queues have been explained in [Basic tutorial 7: Multithreading and Pad Availability](Basic%2Btutorial%2B7%253A%2BMultithreading%2Band%2BPad%2BAvailability.html). 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 [Basic tutorial 7: Multithreading and Pad Availability](Basic%2Btutorial%2B7%253A%2BMultithreading%2Band%2BPad%2BAvailability.html) 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 [Basic tutorial 12: Streaming](Basic%2Btutorial%2B12%253A%2BStreaming.html). As a rule of thumb, prefer `queue2` over `queue` whenever network buffering is a concern to you. See [Basic tutorial 12: Streaming](Basic%2Btutorial%2B12%253A%2BStreaming.html) for an example (`queue2` is hidden inside `playbin2`). ### `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 `decodebin2`, but you will rarely need to instantiate it yourself in a normal playback application. ### `tee` [Basic tutorial 7: Multithreading and Pad Availability](Basic%2Btutorial%2B7%253A%2BMultithreading%2Band%2BPad%2BAvailability.html) 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 ! ffmpegcolorspace ! autovideosink ``` # Capabilities ### `capsfilter` [Basic tutorial 10: GStreamer tools](Basic%2Btutorial%2B10%253A%2BGStreamer%2Btools.html) 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. ``` lang=bash gst-launch-1.0 videotestsrc ! video/x-raw-gray ! ffmpegcolorspace ! 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 `decodebin2`, 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 [Basic tutorial 9: Media information gathering](Basic%2Btutorial%2B9%253A%2BMedia%2Binformation%2Bgathering.html)). # 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\!