2005-07-20 08:29:06 +00:00
|
|
|
<chapter id="chapter-other-oneton" xreflabel="Writing a Demuxer or Parser">
|
|
|
|
<title>Writing a Demuxer or Parser</title>
|
2004-02-02 21:52:46 +00:00
|
|
|
<para>
|
2005-07-20 08:29:06 +00:00
|
|
|
Demuxers are the 1-to-N elements that need very special care.
|
2004-03-26 01:53:06 +00:00
|
|
|
They are responsible for timestamping raw, unparsed data into
|
|
|
|
elementary video or audio streams, and there are many things that you
|
|
|
|
can optimize or do wrong. Here, several culprits will be mentioned
|
|
|
|
and common solutions will be offered. Parsers are demuxers with only
|
|
|
|
one source pad. Also, they only cut the stream into buffers, they
|
|
|
|
don't touch the data otherwise.
|
|
|
|
</para>
|
2005-07-20 08:29:06 +00:00
|
|
|
<para>
|
|
|
|
As mentioned previously in <xref linkend="chapter-negotiation"/>,
|
|
|
|
demuxers should use fixed caps, since their data type will not change.
|
|
|
|
</para>
|
|
|
|
<para>
|
|
|
|
As discussed in <xref linkend="chapter-scheduling"/>, demuxer elements
|
|
|
|
can be written in multiple ways:
|
|
|
|
</para>
|
|
|
|
<itemizedlist>
|
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
They can be the driving force of the pipeline, by running their own
|
|
|
|
task. This works particularly well for elements that need random
|
|
|
|
access, for example an AVI demuxer.
|
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
They can also run in push-based mode, which means that an upstream
|
|
|
|
element drives the pipeline. This works particularly well for streams
|
|
|
|
that may come from network, such as Ogg.
|
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
</itemizedlist>
|
|
|
|
<para>
|
|
|
|
In addition, audio parsers with one output can, in theory, also be written
|
|
|
|
in random access mode. Although simple playback will mostly work if your
|
|
|
|
element only accepts one mode, it may be required to implement multiple
|
|
|
|
modes to work in combination with all sorts of applications, such as
|
|
|
|
editing. Also, performance may become better if you implement multiple
|
|
|
|
modes. See <xref linkend="chapter-scheduling"/> to see how an element
|
|
|
|
can accept multiple scheduling modes.
|
|
|
|
</para>
|
2004-02-02 21:52:46 +00:00
|
|
|
</chapter>
|