Basic Concepts
This chapter of the guide introduces the basic concepts of &GStreamer;.
Understanding these concepts will help you see the issues involved in
extending &GStreamer;. Many of these concepts are explained in greater
detail in the &GstAppDevMan;. The basic concepts presented here serve mainly
to refresh your memory.
Elements and Plugins
Elements are at the core of &GStreamer;. In the context of plugin
development, an element is an object derived from the
GstElement class. An element provides some sort of
functionality when connected with other elements. Without elements,
&GStreamer; is just a bunch of conceptual pipe fittings with nothing to
connect. A large number of elements ship with &GStreamer;, but extra
elements can also be written. The purpose of this guide is to help you
learn to create new elements, which are encapsulated in plugins as
described below.
A filter is an important type of element that
processes a stream of data, as opposed to producing or consuming streams
of data. Producers and consumers of data are called
source and sink elements,
respectively.
Just writing a new element is not entirely enough, however: You will need
to encapsulate your element in a plugin to enable &GStreamer; to use it. A
plugin is essentially a loadable block of code,
usually a shared object file or dynamically linked library. A single
plugin may contain the implementation of several elements, or just a
single one. For simplicity, this guide concentrates primarily on plugins
containing one filter type element.
The plugin mechanism is used everywhere in &GStreamer;, even if only the
standard package is being used. A few very basic functions reside in the
core library, and all others are implemented in plugins. A plugin registry
is used to store the details of the plugins in an XML file. This way, a
program using &GStreamer; does not have to load all plugins to determine
which are needed. Plugins are only loaded when their provided elements are
requested.
See the &GstLibRef; for the current implementation details of GstElement
and GstPlugin.
Pads
Pads are used to negotiate connections and data flow
between elements in &GStreamer;. A pad can be viewed as a
place
on an element where connections may be made with
other elements. Pads have specific data handling capabilities: That is, a
pad only knows how to give or receive certain types of data. Connections
are only allowed when the capabilities of two pads are compatible.
An analogy may be helpful here. A pad is similar to a plug or jack on a
physical device. Consider, for example, a home theater system consisting
of an amplifier, a DVD player, and a television. Connecting the DVD player
to the amplifier is allowed only because both devices have audio jacks,
and connecting the television to the DVD player is allowed because both
devices have compatible video jacks. Pads in &GStreamer; serve the same
purpose as the jacks in the home theater system.
See the &GstLibRef; for the current implementation details of a GstPad.
Buffers
All streams of data in &GStreamer; are chopped up into chunks that are
passed from a source pad on one element to a sink pad on another element.
Buffers are structures used to hold these chunks of
data. Buffers can be of any size, theoretically. Buffers may contain any
sort of data that the two pads involved know how to handle: Normally, a
buffer contains a chunk of some sort of audio or video data that flows
from one element to another.
Buffers also contain metadata describing the buffer's contents. Some of
the important types of metadata are:
A pointer to the buffer's data.
An integer indicating the size of the buffer's data.
A GstData object describing the type of the
buffer's data.
A reference count indicating the number of elements currently
holding a reference to the buffer. When the buffer reference count
falls to zero, the buffer will be unlinked, and its memory will be
freed in some sense (see the next part about for more details).
See the &GstLibRef; for the current implementation details of a GstBuffer.
Buffer Allocation and Buffer Pools
Buffers can be allocated using various schemes, and they may either be
passed on by an element or unreferenced, thus freeing the memory used by
the buffer.
Normally, filter elements in &GStreamer; deal with a buffer in place,
meaning that they do not create or destroy buffers. Sometimes, however,
elements might need to alter the reference count of a buffer to copy or
destroy the buffer, or to create a new buffer. For the most part, this
guide does not deal with elements that alter a buffer's reference count,
but buffer referencing is an important concept to know.
Types and Properties
&GStreamer; uses a type system to ensure that the data passed between
elements is in a recognized format. The type system is also important for
ensuring that the parameters required to fully specify a format match up
correctly when connecting pads between elements. Each connection that is
made between elements has a specified type.
The Basic Types
&GStreamer; already supports many basic media types. Following is a
table of the basic types used for buffers in &GStreamer;. The table
contains the name ("mime type") and a description of the type, the
properties associated with the type, and the meaning of each property.
Table of Basic Types
Mime Type
Description
Property
Property Type
Property Values
Property Description
audio/raw
Unstructured and uncompressed raw audio data.
rate
integer
greater than 0
The sample rate of the data, in samples per second.
channels
integer
greater than 0
The number of channels of audio data.
format
string
int
or float
The format in which the audio data is passed.
law
integer
0, 1, or 2
(Valid only if the data is in integer format.) The law used to
describe the data. The value 0 indicates linear
, 1
indicates mu law
, and 2 indicates
A law
.
endianness
boolean
0 or 1
(Valid only if the data is in integer format.) The order of bytes
in a sample. The value 0 means little-endian
(bytes
are least significant first). The value 1 means
big-endian
(most significant byte first).
signed
boolean
0 or 1
(Valid only if the data is in integer format.) Whether the samples
are signed or not.
width
integer
greater than 0
(Valid only if the data is in integer format.) The number of bits
per sample.
depth
integer
greater than 0
(Valid only if the data is in integer format.) The number of bits
used per sample. This must be less than or equal to the width: If
the depth is less than the width, the low bits are assumed to be
the ones used. For example, a width of 32 and a depth of 24 means
that each sample is stored in a 32 bit word, but only the low 24
bits are actually used.
layout
string
gfloat
(Valid only if the data is in float format.) A string representing
the way in which the floating point data is represented.
intercept
float
any, normally 0
(Valid only if the data is in float format.) A floating point
value representing the value that the signal
centers
on.
slope
float
any, normally 1.0
(Valid only if the data is in float format.) A floating point
value representing how far the signal deviates from the intercept.
A slope of 1.0 and an intercept of 0.0 would mean an audio signal
with minimum and maximum values of -1.0 and 1.0. A slope of
0.5 and intercept of 0.5 would represent values in the range 0.0
to 1.0.
audio/mp3
Audio data compressed using the mp3 encoding scheme.
framed
boolean
0 or 1
A true value indicates that each buffer contains exactly one
frame. A false value indicates that frames and buffers do not
necessarily match up.
layer
integer
1, 2, or 3
The compression scheme layer used to compress the data.
bitrate
integer
greater than 0
The bitrate, in kilobits per second. For VBR (variable bitrate)
mp3 data, this is the average bitrate.
channels
integer
greater than 0
The number of channels of audio data present.
joint-stereo
boolean
0 or 1
If true, this implies that stereo data is stored as a combined
signal and the difference between the signals, rather than as two
entirely separate signals. If true, the channels
attribute must not be zero.
audio/x-ogg
Audio data compressed using the Ogg Vorbis encoding scheme.
FIXME: There are currently no parameters defined for this type.
video/raw
Raw video data.
fourcc
FOURCC code
A FOURCC code identifying the format in which this data is stored.
FOURCC (Four Character Code) is a simple system to allow
unambiguous identification of a video datastream format. See
http://www.webartz.com/fourcc/
width
integer
greater than 0
The number of pixels wide that each video frame is.
height
integer
greater than 0
The number of pixels high that each video frame is.
video/mpeg
Video data compressed using an MPEG encoding scheme.
FIXME: There are currently no parameters defined for this type.
video/avi
Video data compressed using the AVI encoding scheme.
FIXME: There are currently no parameters defined for this type.
Events
Events are a special type of data in &GStreamer;.
Events indicate some sort of notable event that has
happened somewhere in an element's pipeline. Just like any other data
type, an event comes to an element through its pads. Events are contained
in a GstBuffer, so an event buffer will contain
only an event, not any other type of data.
See the &GstLibRef; for the current implementation details of a GstEvent.