| <?xml version='1.0'?> |
| <!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"> |
| |
| <!ENTITY INTRO_PREFACE SYSTEM "intro-preface.xml"> |
| <!ENTITY INTRO_BASICS SYSTEM "intro-basics.xml"> |
| |
| <!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_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"> |
| <!ENTITY BUILDING_FILTERFACT SYSTEM "building-filterfactory.xml"> |
| |
| <!ENTITY ADVANCED_SCHEDULING SYSTEM "advanced-scheduling.xml"> |
| <!ENTITY ADVANCED_TYPES SYSTEM "advanced-types.xml"> |
| <!ENTITY ADVANCED_REQUEST SYSTEM "advanced-request.xml"> |
| <!ENTITY ADVANCED_CLOCK SYSTEM "advanced-clock.xml"> |
| <!ENTITY ADVANCED_DPARAMS SYSTEM "advanced-dparams.xml"> |
| <!ENTITY ADVANCED_MIDI SYSTEM "advanced-midi.xml"> |
| <!ENTITY ADVANCED_INTERFACES SYSTEM "advanced-interfaces.xml"> |
| <!ENTITY ADVANCED_TAGGING SYSTEM "advanced-tagging.xml"> |
| <!ENTITY ADVANCED_EVENTS SYSTEM "advanced-events.xml"> |
| |
| <!ENTITY OTHER_SOURCE SYSTEM "other-source.xml"> |
| <!ENTITY OTHER_SINK SYSTEM "other-sink.xml"> |
| <!ENTITY OTHER_ONETON SYSTEM "other-oneton.xml"> |
| <!ENTITY OTHER_NTOONE SYSTEM "other-ntoone.xml"> |
| <!ENTITY OTHER_NTON SYSTEM "other-nton.xml"> |
| <!ENTITY OTHER_MANAGER SYSTEM "other-manager.xml"> |
| |
| <!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; |
| |
| <!-- ############# part ############### --> |
| |
| <part id="part-introduction" xreflabel="Introduction"> |
| <title>Introduction</title> |
| <partintro> |
| <para> |
| &GStreamer; is an exremely 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> |
| |
| <!-- ############ 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>ExampleFilter</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_STATE; |
| &BUILDING_PROPS; |
| &BUILDING_SIGNALS; |
| &BUILDING_TESTAPP; |
| &BUILDING_FILTERFACT; |
| </part> |
| |
| <!-- ############ 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_SCHEDULING; |
| &ADVANCED_TYPES; |
| &ADVANCED_REQUEST; |
| &ADVANCED_CLOCK; |
| &ADVANCED_DPARAMS; |
| &ADVANCED_MIDI; |
| &ADVANCED_INTERFACES; |
| &ADVANCED_TAGGING; |
| &ADVANCED_EVENTS; |
| |
| <!-- FIXME: add querying, event handling and conversion --> |
| |
| </part> |
| |
| <!-- ############ part ############# --> |
| |
| <part id="part-other" xreflabel="Other Element Types"> |
| <title>Other Element Types</title> |
| <partintro> |
| <para> |
| By now, we have looked at pretty much any feature that can be embedded |
| into a &GStreamer; element. However, we have limited ourselves to the |
| simple model of a filter element. In this chapter, we will look at the |
| specific difficulties and things to keep in mind when writing specific |
| types of elements. We will discuss output elements (sinks), input |
| elements (sources), 1-to-N elements, N-to-1 elements, N-to-N elements, |
| autopluggers and managers. Some of these represent elements that don't |
| actually exist. Rather, they represent a general concept. |
| </para> |
| </partintro> |
| |
| &OTHER_SOURCE; |
| &OTHER_SINK; |
| &OTHER_ONETON; |
| &OTHER_NTOONE; |
| &OTHER_NTON; |
| &OTHER_MANAGER; |
| </part> |
| |
| <!-- ############ 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> |