This paper will present the GStreamer Media framework. We 
explain briefly what a media framework is and what its advantages
are. This introduction presents the basic design of GStreamer
and how the modularity can provide many benefits when building 
multimedia applications ranging from simple audio/video players 
to complex audio/video mixing and non linear editing.

We then go into more detail about the different components of
the framework and how specific problems were solved.
State changes are covered first as they bring the pipeline with
all its components from a sleeping to a running state. The most
interesting problem here is error recovery and thread interlocking.

We expand on the scheduler that is responsible for making sure all 
of the components don't step on eachothers toes as they pass along 
data. We explain one of the possible scheduling methods using
cothreads and expand on how the number of cothread switches can
be reduced in order to make the data flow as fast as possible.

Since GStreamer is a very open system that can basically handle
any media type, a mechanism is provided to negotiate the media
types between plugins. We continue with an explanation of how
this type negotiation is done.

Events are the mechanism to indicate changes in the data that is
flowing through the pipeline, such as End Of Stream notification
or seek and flush events. We explain how these events work and
how they interact with the scheduler.

We finally cover some of the interesting libraries that are 
provided with GStreamer, such as the bytestream library. We 
explain how all the pieces fit together and how we combine different
techniques to create a very fast read API.
