| <?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> |
| <para> |
| The example code used in this part of the guide can be found in |
| <filename class="directory">examples/pwg/examplefilter/</filename> in |
| your &GStreamer; directory. |
| </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> |