# GStreamer

GStreamer è una piattaforma software altamente modulare utilizzata per creare applicazioni multimediali.

## Introduzione

L'idea alla base della concezione di GStreamer è la pipeline: questo termine (in inglese significa tubatura) è usato per indicare un insieme di elementi collegati uno in serie all'altro.
Gli elementi con i quali costituire una pipeline sono di tre tipi: source(sorgente), filter(filtro), sink(pozzo, ad indicare un elemento finale, senza uscite). Ogni applicazione che utilizzi GStreamer contiene almeno una pipeline.
La metafora della pipeline si può spiegare facilmente con un esempio. Un comune player MP3, visto come pipeline, è composto da tre elementi:
* source: la parte di programma che si occupa di prelevare i dati da un file, o da un server rtsp, o da una qualsiasi altra sorgente.
* decoder filter: un componente in grado di decodificare o di decomprimere i dati provenienti dall'elemento precedente in modo da portarli ad un formato non compresso e facile da maneggiare e comprensibile alle altre parti del programma
* sink: l'elemento che dialoga con i driver audio del sistema operativo al fine di riprodurre sulle casse i dati
Ognuno degli elementi che costituisce il player MP3 è di norma contenuto in un plugin.
Il vero scopo di GStreamer è quello di rendere possibile la realizzazione di applicazioni multimediali utilizzando elementi già esistenti (plugin) in grado di interagire: in sostanza definisce un protocollo/modello di comunicazione e di scambio di dati ed eventi tra elementi.

## I plugin

I plugin sono molto diffusi soprattutto nel campo delle applicazioni multimediali. Un problema molto diffuso è quello della compatibilità: un particolare plugin funziona soltanto con l'applicazione per la quale è stato sviluppato. GStreamer tenta di porre fine a queste incompatibilità definendo una API multimediale. L'applicazione di uno sviluppatore che utilizzi GStreamer come piattaforma per la gestione e generazione di plugin multimediali è compatibile con tutti gli altri plugin e tutte le altre applicazioni che a loro volta sono basate su GStreamer.

### Black Box

Una Black Box (dall'inglese scatola nera) è qualcosa con cui si interagisce senza sapere come funziona internamente. Uno dei vantaggi maggiori nell'utilizzo di una piattaforma come GStreamer è quello di poter interagire con plugin senza conoscerne il funzionamento. Basta sapere a cosa serve e che tipi di dati (audio, video, ...) e formati (wave, RAW, MPEG-4...) usa per usare un qualsiasi plugin di GStreamer.

## Elementi in dettaglio

Per formare una pipeline, gli elementi vanno collegati gli uni agli altri utilizzando quello che è l'equivalente in GStreamer dei comuni connettori: i pad. Per immaginare un pad si pensi a delle apparecchiature elettroniche che si collegano tra di loro, per esempio televisione e videoregistratore: la connessione avviene tramite i connettori SCART. In GStreamer i pad sono caratterizzati da un particolare tipo di dati e dal tipo di connessione permessa: per continuare con l'esempio del televisore e del videoregistratore, si può dire che non è possibile collegare un connettore SCART ad un connettore per le cuffie.
Gli elementi, classificati in base al tipo e al numero di pad, possono essere di tre tipi:
* source: prelevano dati da fonti esterne al programma come file, altri programmi, connessioni di rete, etc. Hanno una uscita source pad.
* sink: mandano dati provenienti dal programma a componenti esterne come file, altri programmi, connessioni di rete, etc. Hanno un ingresso sink pad.
* filter: possono essere collegati solo ad altri elementi, quindi non sono usati per comunicare con l'esterno. Il loro scopo è quello di modificare, convertire o elaborare i dati. hanno sempre almeno un source pad e un sink pad
* Elemento source
* Elemento sink
* Elemento filter