blob: 52d729e088bc22b3e6a6082776270626b8052ca6 [file] [log] [blame]
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
<!ENTITY % image-entities SYSTEM "image.entities">
%image-entities;
<!ENTITY % version-entities SYSTEM "version.entities">
%version-entities;
<!ENTITY TITLEPAGE SYSTEM "titlepage.xml">
<!-- Part 1: Introduction -->
<!ENTITY INTRO_PREFACE SYSTEM "intro-preface.xml">
<!ENTITY INTRO_BASICS SYSTEM "intro-basics.xml">
<!-- Part 2: Building a Plugin -->
<!ENTITY BUILDING_BOILER SYSTEM "building-boiler.xml">
<!ENTITY BUILDING_DEBUG SYSTEM "building-debug.xml">
<!ENTITY BUILDING_PADS SYSTEM "building-pads.xml">
<!ENTITY BUILDING_CHAINFN SYSTEM "building-chainfn.xml">
<!ENTITY BUILDING_EVENTFN SYSTEM "building-eventfn.xml">
<!ENTITY BUILDING_QUERYFN SYSTEM "building-queryfn.xml">
<!ENTITY BUILDING_STATE SYSTEM "building-state.xml">
<!ENTITY BUILDING_PROPS SYSTEM "building-props.xml">
<!ENTITY BUILDING_SIGNALS SYSTEM "building-signals.xml">
<!ENTITY BUILDING_TESTAPP SYSTEM "building-testapp.xml">
<!-- Part 3: Advanced Filter Concepts -->
<!ENTITY ADVANCED_REQUEST SYSTEM "advanced-request.xml">
<!ENTITY ADVANCED_SCHEDULING SYSTEM "advanced-scheduling.xml">
<!ENTITY ADVANCED_NEGOTIATION SYSTEM "advanced-negotiation.xml">
<!ENTITY ADVANCED_ALLOCATION SYSTEM "advanced-allocation.xml">
<!ENTITY ADVANCED_TYPES SYSTEM "advanced-types.xml">
<!ENTITY ADVANCED_EVENTS SYSTEM "advanced-events.xml">
<!ENTITY ADVANCED_CLOCK SYSTEM "advanced-clock.xml">
<!ENTITY ADVANCED_QOS SYSTEM "advanced-qos.xml">
<!ENTITY ADVANCED_DPARAMS SYSTEM "advanced-dparams.xml">
<!ENTITY ADVANCED_INTERFACES SYSTEM "advanced-interfaces.xml">
<!ENTITY ADVANCED_TAGGING SYSTEM "advanced-tagging.xml">
<!-- Part 4: Creating special element types -->
<!ENTITY OTHER_BASE SYSTEM "other-base.xml">
<!ENTITY OTHER_ONETON SYSTEM "other-oneton.xml">
<!ENTITY OTHER_NTOONE SYSTEM "other-ntoone.xml">
<!ENTITY OTHER_MANAGER SYSTEM "other-manager.xml">
<!-- Appendices -->
<!ENTITY APPENDIX_CHECKLIST SYSTEM "appendix-checklist.xml">
<!ENTITY APPENDIX_PORTING SYSTEM "appendix-porting.xml">
<!ENTITY APPENDIX_LICENSING SYSTEM "appendix-licensing.xml">
<!ENTITY APPENDIX_PYTHON SYSTEM "appendix-python.xml">
<!ENTITY GStreamer "<application>GStreamer</application>">
<!ENTITY GstAppDevMan "<emphasis>GStreamer Application Development Manual</emphasis>">
<!ENTITY GstLibRef "<emphasis>GStreamer Library Reference</emphasis>">
]>
<book id="index">
&TITLEPAGE;
<!-- ############# Introduction - part ############### -->
<part id="part-introduction" xreflabel="Introduction">
<title>Introduction</title>
<partintro>
<para><!-- synchronize with AppDevMan -->
&GStreamer; is an extremely powerful and versatile framework for creating
streaming media applications. Many of the virtues of the &GStreamer;
framework come from its modularity: &GStreamer; can seamlessly
incorporate new plugin modules. But because modularity and power often
come at a cost of greater complexity (consider, for example, <ulink
type="http" url="http://www.omg.org/">CORBA</ulink>), writing new
plugins is not always easy.
</para>
<para>
This guide is intended to help you understand the &GStreamer; framework
(version &GST_VERSION;) so you can develop new plugins to extend the
existing functionality. The guide addresses most issues by following the
development of an example plugin - an audio filter plugin -
written in C. However, the later parts of the guide also present some
issues involved in writing other types of plugins, and the end of the
guide describes some of the Python bindings for &GStreamer;.
</para>
</partintro>
&INTRO_PREFACE;
&INTRO_BASICS;
</part>
<!-- ############ Building a Plugin - part ############# -->
<part id="part-building" xreflabel="Building a Plugin">
<title>Building a Plugin</title>
<partintro>
<para>
You are now ready to learn how to build a plugin. In this part of the
guide, you will learn how to apply basic &GStreamer;
programming concepts to write a simple plugin. The previous parts of the
guide have contained no explicit example code, perhaps making things a
bit abstract and difficult to understand. In contrast, this section will
present both applications and code by following the development of an
example audio filter plugin called <quote>MyFilter</quote>.
</para>
<para>
The example filter element will begin with a single input pad and a
single
output pad. The filter will, at first, simply pass media and event data
from its sink pad to its source pad without modification. But by the end
of this part of the guide, you will learn to add some more interesting
functionality, including properties and signal handlers. And after
reading the next part of the guide, <xref linkend="part-advanced"/>, you
will be able to add even more functionality to your plugins.
</para>
</partintro>
&BUILDING_BOILER;
&BUILDING_PADS;
&BUILDING_CHAINFN;
&BUILDING_EVENTFN;
&BUILDING_QUERYFN;
&BUILDING_STATE;
&BUILDING_PROPS;
&BUILDING_SIGNALS;
&BUILDING_TESTAPP;
</part>
<!-- ############ Advanced Filter Concepts - part ############# -->
<part id="part-advanced" xreflabel="Advanced Filter Concepts">
<title>Advanced Filter Concepts</title>
<partintro>
<para>
By now, you should be able to create basic filter elements that can
receive and send data. This is the simple model that &GStreamer; stands
for. But &GStreamer; can do much more than only this! In this chapter,
various advanced topics will be discussed, such as scheduling, special
pad types, clocking, events, interfaces, tagging and more. These topics
are the sugar that makes &GStreamer; so easy to use for applications.
</para>
</partintro>
&ADVANCED_REQUEST;
&ADVANCED_SCHEDULING;
&ADVANCED_NEGOTIATION;
&ADVANCED_ALLOCATION;
&ADVANCED_TYPES;
&ADVANCED_EVENTS;
&ADVANCED_CLOCK;
&ADVANCED_QOS;
&ADVANCED_DPARAMS;
&ADVANCED_INTERFACES;
&ADVANCED_TAGGING;
<!-- FIXME: add querying, event handling and conversion -->
</part>
<!-- ############ Creating special element types - part ############# -->
<part id="part-other" xreflabel="Creating special element types">
<title>Creating special element types</title>
<partintro>
<para>
By now, we have looked at pretty much any feature that can be embedded
into a &GStreamer; element. Most of this has been fairly low-level and
given deep insights in how &GStreamer; works internally. Fortunately,
&GStreamer; contains some easier-to-use interfaces to create such
elements. In order to do that, we will look closer at the element
types for which &GStreamer; provides base classes (sources, sinks and
transformation elements). We will also look closer at some types of
elements that require no specific coding such as scheduling-interaction
or data passing, but rather require specific pipeline control (e.g.
N-to-1 elements and managers).
</para>
</partintro>
&OTHER_BASE;
&OTHER_ONETON;
&OTHER_NTOONE;
&OTHER_MANAGER;
</part>
<!-- ############ Appendices - part ############# -->
<part id="part-appendix" xreflabel="Appendices">
<title>Appendices</title>
<partintro>
<para>
This chapter contains things that don't belong anywhere else.
</para>
</partintro>
&APPENDIX_CHECKLIST;
&APPENDIX_PORTING;
&APPENDIX_LICENSING;
&APPENDIX_PYTHON;
</part>
</book>