&TITLEPAGE;

## Introduction

&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, CORBA), writing new plugins is not always easy.

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;.

&INTRO_PREFACE; &INTRO_BASICS;

## Building a Plugin

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 MyFilter.

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, , you will be able to add even more functionality to your plugins.

The example code used in this part of the guide can be found in `examples/pwg/examplefilter/` in your &GStreamer; directory.

&BUILDING_BOILER; &BUILDING_PADS; &BUILDING_CHAINFN; &BUILDING_EVENTFN; &BUILDING_QUERYFN; &BUILDING_STATE; &BUILDING_PROPS; &BUILDING_SIGNALS; &BUILDING_TESTAPP;

## Advanced Filter Concepts

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.

&ADVANCED_REQUEST; &ADVANCED_SCHEDULING; &ADVANCED_NEGOTIATION; &ADVANCED_ALLOCATION; &ADVANCED_TYPES; &ADVANCED_EVENTS; &ADVANCED_CLOCK; &ADVANCED_QOS; &ADVANCED_DPARAMS; &ADVANCED_INTERFACES; &ADVANCED_TAGGING;

## Creating special element types

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).

&OTHER_BASE; &OTHER_ONETON; &OTHER_NTOONE; &OTHER_MANAGER;

## Appendices

This chapter contains things that don't belong anywhere else.

&APPENDIX_CHECKLIST; &APPENDIX_PORTING; &APPENDIX_LICENSING; &APPENDIX_PYTHON;