Dvbstream

 

 

 

 

Questo programma e' lo strumento base per interagire con la scheda di ricezione satellitare digitale SS2 (sintonizzazione ed estrazione del Transport Stream). Realizzato da Dave Chapman e' distribuito con licenza open source.

Per questo software si fa riferimento al sito www.linuxstb.org , in cui andando nella sezione “Software” e cliccando “dvbstream” si accede ad una guida di installazione ed uso (molto breve) e naturalmente si puo' effettuare il download del programma.

E' stata usata l’ultima versione CVS in quanto compatibile con gli ultimi driver di linuxtv (come indicato nella guida stessa).

Si installa il programma digitando “make” nella directory dei sorgenti ,eventualmente dopo aver modificato il “Makefile” per inserire, nelle prime righe, il percorso corretto degli “include files” dei driver DVB.

Dvbstream e' in grado di inviare in LAN tramite il protocollo rtp l’intero trasport stream di un transponder DVB o una sua parte o eventualmente può trasmettere un ps (program stream) dopo una conversione.

 

L' uso del programma e' molto semplice e avviene mediante linea di comando.

Ecco un esempio:

 

# dvbstream -i 224.0.1.2 -r 1234 -f 11766 -p V -s 27500 512 650

 

Questo comando permette di mandare RAI1 in streaming sulla rete con indirizzo multicast 224.0.1.2:1234 .

Va indicata la frequenza (in Mhz), la polarizzazione (V per verticale e H per orizzontale) e il symbol rate (in Kilo simboli), mentre gli ultimi due valori sono i pid del canale estratti dal ts (trasport stream) satellitare, uno video ed uno audio, che vengono poi multiplexati e inviati come ts in rtp.

 

Sono state introdotte alcune modifiche al codice, con l'aiuto del Prof. Zanichelli , per l'uso di piu' schede SS2, per permettere l'invio del pid 0, contenente la PAT, e alcune altre. 

Riportiamo i tratti di codice originale con di seguito quello modificato:

 

 

dvbstream.c

 

 

(originale)

...

          if (pid) {

            if (npids == MAX_CHANNELS) {

              fprintf(stderr,"\nSorry, you can only set up to %d filters.\n\n",MAX_CHANNELS);

              return(-1);

            } else {

              pestypes[npids]=pestype;

              pestype=DMX_PES_OTHER;

              pids[npids++]=pid;

              if (pid2!=-1) {

                hi_mappids[pid]=pid2>>8;

                lo_mappids[pid]=pid2&0xff;

                fprintf(stderr,"Mapping %d to %d\n",pid,pid2);

              }

            }

          }

...

 

(modificato)

...

           if (pid) {

            if (npids == MAX_CHANNELS) {

              fprintf(stderr,"\nSorry, you can only set up to %d filters.\n\n",MAX_CHANNELS);

              return(-1);

            } else {

 

                        if(pid==8193)

                           pid=0;

 

              pestypes[npids]=pestype;

              pestype=DMX_PES_OTHER;

              pids[npids++]=pid;

              if (pid2!=-1) {

                hi_mappids[pid]=pid2>>8;

                lo_mappids[pid]=pid2&0xff;

                fprintf(stderr,"Mapping %d to %d\n",pid,pid2);

              }

            }

          }

...

 

 

 

(originale)

...

          if ((output_type==RTP_PS) && (npids!=2)) {

             fprintf(stderr,"ERROR: PS requires exactly two PIDS - video and audio.\n");

             exit;

         }

 

(aggiunto)

          #if 1

          if(card > 0) /* Only first card can choose pol/band as we're using a passive splitter !!!! */

                 {

                  pol = 'N';

                  tone = -1 ;

                 }

         #endif

...

 

 

 

(originale)

...

             int ttl;

...

 

(modificato)

...

             int ttl=1;   // fixed ttl default

...

 

 

 

(originale)

...

           } else if (strcmp(argv[i],"-v")==0) {

             pestype=DMX_PES_VIDEO;

           } else if (strcmp(argv[i],"-a")==0) {

             pestype=DMX_PES_AUDIO;

...

 

(modificato)

           } else if (strcmp(argv[i],"-v")==0) {

             pestype=DMX_PES_VIDEO;

// selection of TTL

      } else if (strcmp(argv[i],"-ttl")==0) {

        i++;

        ttl=atoi(argv[i]);

// end of selection of TTL

           } else if (strcmp(argv[i],"-a")==0) {

             pestype=DMX_PES_AUDIO;

...

 

 

 

(originale)

...

          ttl = 2;

...

 

(modificato)

...

//     ttl = 2;

...

 

 

 

(originale)

...

          name.sin_family = AF_INET;

          name.sin_port = htons(port);

          name.sin_addr.s_addr = htonl(INADDR_ANY);

...

 

(modificato)

...

          name.sin_family = AF_INET;

          name.sin_port = htons(port+card); /* each card gets its own port 12345,12346,... */

          name.sin_addr.s_addr = htonl(INADDR_ANY);

...

 

 

 

tune.c

 

 

(originale)

...

        if ((pol=='h') || (pol=='H')) {

          voltage = SEC_VOLTAGE_18;

        } else

          voltage = SEC_VOLTAGE_13;

...

 

(modificato)

...

        if ((pol=='h') || (pol=='H')) {

          voltage = SEC_VOLTAGE_18;

        } else

          if ((pol=='v') || (pol=='V'))

            voltage = SEC_VOLTAGE_13;

# vlc --color --sout-all -I rc rtp/ts2:@:1230 --sout '#duplicate{dst="std{access=file,mux=ts,url=prova}",select="program=1"}' --ttl 1          else

            voltage = SEC_VOLTAGE_OFF;     

...

 

 

 

L' ultima modifica di “dvbstream.c” permette di avere diverse socket (utilizzate per il controllo via telnet), per diverse istanze di dvbstream; nel nostro caso è stata necessaria per evitare un conflitto tra i dvbstream in esecuzione.

Inoltre si è inserita la possibilita' di impostare il “time to live” dei pacchetti udp con il parametro “-ttl <valore>”, da aggiungere a quelli che e' possibile dare dalla linea di comando (di default il ttl ha valore 2).

Vediamo una schermata di output di dvbstream; la stringa usata da riga di comando e':

 

# dvbstream -c 0 -i 127.0.0.1 -r 1230 -f 11919 -p V -s 27500 8193 256 660 513

 

 

dvbstream v0.4pre3 - (C) Dave Chapman 2001

Released under the GPL.

Latest version available from http://www.linuxstb.org/

Using Pol=56 Tone=-1

Using DVB card "Zarlink MT312"

tuning DVB-S to L-Band:1, Pol:V Srate=27500000, 22kHz=off

polling....

Getting frontend event

FE_STATUS: FE_HAS_SIGNAL FE_HAS_LOCK FE_HAS_CARRIER FE_HAS_VITERBI FE_HAS_SYNC

Event:  Frequency: 11919000

        SymbolRate: 27500000

        FEC_inner:  2

 

Bit error rate: 0

Signal strength: 15832

SNR: 47097

FE_STATUS: FE_HAS_SIGNAL FE_HAS_LOCK FE_HAS_CARRIER FE_HAS_VITERBI FE_HAS_SYNC

Setting filter for PID 0

Setting filter for PID 256

Setting filter for PID 660

Setting filter for PID 513

Using 127.0.0.1:1230:1

version=2

Streaming 4 streams

 

 

La prima cosa che fa il programma e' il settaggio del frontend della scheda, da cui riceve informazioni sul suo stato, poi filtra i pid e fa lo streaming; ecco la sequenza più in dettaglio:

 

1.vengono forniti al Frontend (che si occupa anche del SEC) le impostazioni necessarie alla ricezione in base alle informazioni di sintonizzazione (frequenza, polarizzazione, symbol rate);

2.vengono chieste al Frontend delle informazioni sul risultato delle impostazioni assegnategli (tramite le API, con la lettura di dati di tipo fe_status) :

1.FE_HAS_SIGNAL indica che c'e' un segnale che emerge dal rumore;

2.FE_HAS_CARRIER indica che e' stato trovato un segnale DVB;

3.FE_HAS_VITERBI indica che la FEC (la cui ratio e' trovata automaticamente) e' stabile;

4.FE_HAS_SYNC indica che sono stati trovati i sync bytes;

5.FE_HAS_LOCK indica che tutto funziona;

6.FE_TIMEDOUT indica che non si e' verificato un “LOCK” negli ultimi due secondi circa;

 

3.vengono prelevati dal Frontend altri valori: BER (Bit Error Rate), Signal Strenght e SNR (Signal to Noise Ratio), che indicano la “salute” del segnale ricevuto, con valori numerici la cui interpretazione esatta, eccetto per la BER, non e' stata possibile in quanto dipendente dall’ hardware e non chiaramente documentata; con varie osservazioni si e' notato che per un valore superiore a 40000 dello SNR avviene il “LOCK” ed il segnale e' utilizzabile;

4.a questo punto avviene il setting dei filtri hardware per i pid del tuner FlexCop presente sulla SS2, che sono al massimo 39 (da riga di comando è necessario scrivere “8193” per ricevere il pid 0, mentre “8192” permette di ottenere l’ intero transport stream originale);

5.il ts risultante viene incapsulato nello RTP (versione 2) e inviato in rete all' indirizzo stabilito (unicast o multicast).

 

Ecco quindi in rete (o come in questo caso solo sul local host) un flusso multimediale da visualizzare/utilizzare con vlc , mplayer o qualsiasi altro programma in grado di ricevere pacchetti rtp e trattare un transport stream.