Skip to content

Commit

Permalink
Import initial
Browse files Browse the repository at this point in the history
Import initial du projet mumudvb ( multi multicast dvb)
Projet dérivé de dvbstream utile pour diffuser des flux dvb
sur un réseau

git-archimport-id: dubost@crans.ens-cachan.fr--2005-braice/mumudvb--mainline--1.0--base-0
  • Loading branch information
Dubost Brice committed Apr 24, 2005
0 parents commit 5988fbe
Show file tree
Hide file tree
Showing 19 changed files with 2,992 additions and 0 deletions.
339 changes: 339 additions & 0 deletions COPYING

Large diffs are not rendered by default.

37 changes: 37 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
CC=gcc
CFLAGS = -g -Wall -O2 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
OBJS=mumudvb ts_pids

INCS=-I ../DVB/include -I /usr/src/linux/include

ifdef UK
CFLAGS += -DUK
endif

ifdef FINLAND
CFLAGS += -DFINLAND
endif

ifdef FINLAND2
CFLAGS += -DFINLAND2
endif

all: $(OBJS)

mumudvb: mumudvb.c tune.o udp.o dvb.o
$(CC) $(INCS) $(CFLAGS) -o mumudvb mumudvb.c tune.o udp.o dvb.o

tune.o: tune.c tune.h dvb_defaults.h
$(CC) $(INCS) $(CFLAGS) -c -o tune.o tune.c

udp.o: udp.c udp.h
$(CC) $(INCS) $(CFLAGS) -c -o udp.o udp.c

dvb.o: dvb.c dvb.h
$(CC) $(INCS) $(CFLAGS) -c -o dvb.o dvb.c

ts_pids: ts_pids.c
$(CC) $(INCS) $(CFLAGS) -o ts_pids ts_pids.c

clean:
rm -f *.o *~ $(OBJS)
90 changes: 90 additions & 0 deletions README
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
mumudvb - README

Description :
mumudvb est une modification de dvbstream pour le cr@ns (http://www.crans.org) pour lui ajouter des fonctionnalit�s qui nous manquaient, la quantit� de modifications �tant importante nous avons d�cid� de redistribuer le projet (dans l'esprit du logiciel libre).

Auteur principal:
Brice DUBOST (gnu-braice@crans.ens-cachan.fr)

Contributeur:
Manuel SABBAN (manu@crans.ens-cachan.fr) (impl�mentation du getopt)

Remerciements:
Dave CHAPMAN pour avoir �crit dvbstream.

Nouvelles fonctionnalit�s par rapport � la version 0.6 de dvbstream:
-Pouvoir afficher la puissance du signal pendant l'utilisation
-Avoir une liste mise a jour en temps r�el des cha�nes diffus�es
-Avoir un programme qui tourne en tache de fond (en cas d'ex�cution en tache de fond les logs sont �crit via syslog)
-Ce programme devait pouvoir �crire un fichier contenant son pid
-Pouvoir utiliser des fichiers de configuration
-le programme est capable de se tuer tout seul si la carte ne diffuse plus rien au bout d'un temps param�trable
-le programme arr�te de tenter d'accorder la carte au bout d'un temps param�trable
-Surtout pouvoir diffuser plusieurs cha�nes d'un m�me transpondeur sur des ips diff�rentes
-Support fonctionnel du DVB-T

Ce programme n'est pas un patch pour dvbstream � cause de certaines restrictions:
-obligation d'utiliser un fichier de configuration
-param�tres en ligne de commande incompatibles
-les paquets MPEG2 sont envoy�s sans modification sur le r�seau au lieu d'�tre envoy�s avec les en-t�tes RTP (pour une plus grande compatibilit�)
-l'option permettant d'avoir du MPEG2-ps en sortie a �t� retir�e
-l'interface telnet a �t� retir�e (elle ne nous �tait pas utile et l'adapter aurait �t� assez long)

D'autres programmes sont joint dans les sources de mumudvb:
-relay : permet de relayer un flux (r�cup�rer un flux en multicast et l'unicaster ou l'envoyer vers une autre ip de multicast) il peut �tre utiliser pour traverser des routeurs ou des firewalls interdisant le multicast
-dumpudp : permet de r�cup�rer le flux et de l'envoyer sur la sortie standard (utile pour les programmes n'ayant pas de greffon d'entr�e en udp comme mplayer ou pour enregistrer le flux)
-dumpudp_limited : idem que dumpudp mais r�cup�re un nombre limit� de paquets (utilis� pour g�n�rer des vignettes (voir les scripts d'exemple joints))
-recup_sap : mini client sap, r�cup�re les annonces sap sur le r�seau pendant 60 secondes et les envoie sur la sortie standard (non tri�es)
-Des scripts d'exemple d'utilisation de mumudvb sont inclus dans le r�pertoire scripts, ils sont �crits en python, mais aucune documentation n'est fournie, pour savoir ce qu'ils font, il faut lire le code source, nous r�pondront aux questions concernant ces scripts que si on a le temps...

Installation :

Pour installer mumudvb taper:

make
make install (en root)

C'est tout!

Si la compilation ne marche pas ne pas oublier de changer la ligne include du Makefile.


Utilisation :

Pour conna�tre la syntaxe des fichiers de configuration, se r�f�rer au fichier README_CONF

Syntaxe :
mumudvb [options] -c fichier_de_configuration
mumudvb [options] --config fichier_de_configuration
Les diff�rents options possible sont :

-d, --debug
ne se lance pas en d�mon et affiche les messages sur la sortie standard et d'erreur

-s, --signal
Affiche la force du signal pendant que la carte s'accorde et une fois que la carte est accord�, toutes les 5 secondes

-h, --help
affiche l'aide

Signaux : (voir la page de man de kill)
SIGUSR1 : change l'affichage de la puissance une fois la carte tun�e, s'il �tait absent il devient pr�sent et inversement

D�tails techniques (en vrac):
-mumudvb permet de recevoir un signal satellite (DVB-s) ou Terrestre (DVB-t), il ne g�re pas les DisEq (si il y a un besoin ce ne devrait pas �tre trop dur � impl�menter)

-Le pid 0 est envoy� automatiquement avec toutes les cha�nes, il permet au client compatible de distinguer les diff�rents flux pr�sents (indispensable pour vlc, incapable d'identifier par lui m�me les diff�rents flux)

-Pour Vlc, il faut indiquer le pid PMT en plus des pids audio et vid�o (sinon, il est aussi incapable de voir ce qui est pr�sent dans le flux)

-Performances: mumudvb consomme 15% du processeur d'un celeron 2.6GHz avec une carte Hauppauge et un noyau Linux 2.6.9 pour un transpondeur plein (mumudvb a �t� d�velopp� � l'origine dans ce but, apr�s des tests avec VLC qui offrait de piteuses performances, une instabilit� chronique et avec des fonctionnalit�s manquantes pour notre utilisation)

-A �viter : les chipset via non r�cents ou nforce, ces chipset sont des chipsets grand public, incapable de g�rer correctement une grande quantit� de donn�e sur le bus PCI

-mumudvb est capable de diffuser de la TNT (t�l�vision num�rique terrestre)

-mumudvb n'est pas capable de diffuser du dvb-c

-Lors de l'ex�cution le programme �crit la liste des cha�nes diffus�es dans le fichier /var/run/tv/chaines_diffusees_carte%d le %d est remplac� par le num�ro de carte, le chemin n'est pas param�trable mais cela est facile � impl�menter, envoyez moi un mail si vous en avez besoin. Ce fichier contient la liste des cha�nes diffus�es (actualis�e toute les 5 secondes) de la forme suivante (pour chaque ligne) : "nom:ip:port"

-mumudvb supporte au maximum 6 cartes (� l'heure ou j'�cris (04/2005), les possibilit�s sont d'utiliser un noyau 2.4.* avec devfs :-( ou d'utiliser un noyau > 2.6.11 avec udev compil� statiquement avec klibc en attendant la mise a jour de la glibc ), cette limite peut �tre augment�e facilement si quelqu'un a une carte avec plus de 6 slots PCI (on est int�ress� dans ce cas)
35 changes: 35 additions & 0 deletions README_CONF
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
README pour le fichier de configuration de mumudvb

mumudvb utilise obligatoirement un fichier de configuration pour lui indiquer les diff�rents param�tres de r�ception et la r�partition des pids sur les ips de multicast (ces ips peuvent aussi bien �tre de l'unicast). Vous trouverez un exemple dans le fichier conf.example joint aux sources de mumudvb.

mumudvb est insensible � l'ordre des param�tres sauf pour les cha�nes o� les pids doivent �tre mis apr�s l'ip et le port

Des commentaires peuvent �tres fait n'importe ou dans le fichier de configuration, ce sont les lignes qui commencent par un #

Tous les param�tres sont de la forme suivante : nom=valeur

-------------------------------------------------------------------------
|Liste des param�tres et leur description ( (f) : param�tre facultatif )|
-------------------------------------------------------------------------
|Nom : |valeur: |
-------------------------------------------------------------------------
|freq |la fr�quence du transpondeur en MHz
|pol |la polarisation (un caract�re) v ou h (insensible � la casse)
|srate |le srate du transpondeur
|card (f) |le num�ro de la carte (d�faut : 0)
|timeout_accord (f) |temps que l'on laisse � la carte pour s'accorder sur la fr�quence (en secondes) (d�faut : 300 (5min))
|timeout_no_diff (f) |si le programme ne diffuse aucune chaise, il se tuera au bout de ce temps (en secondes) (d�faut : 900 (15min))
| Pour la TNT |
|qam |la modulation en quadrature, valeurs possibles : qpsk,16,32,64,128,256,auto
|trans_mode |le mode de transmission, valeurs possibles : 2k,8k,auto
|bandwidth |la largeur de bande, valeurs possibles : 8MHz,7MHz,6MHz,auto
|guardinterval |l'intervalle de garde, valeurs possibles : 1/32,1/16,1/8,1/4,auto
|coderate |le taux de code, valeurs possibles : none,1/2,2/3,3/4,4/5,5/6,6/7,7/8,8/9,auto
|
--------------------------------------------------------------------------
|Pour chaque chaise
|ip |l'ip de multicast sur laquelle cette chaise sera diffus�e
|port |le port
|pids |une liste de pids s�par�s par des espaces (en nombre quelconque, le pid 0 (pid PAT) �tant automatiquement diffus� pour chacune des cha�nes)
|name (f) |le nom donn� � la cha�ne dans les fichiers qui indique les cha�nes diffus�es actuellement (utilis� par les scripts en exemple pour g�n�rer les annonces SAP), il est conseill� pour le moment de remplacer les espaces par des "_" dans le nom de la cha�ne
--------------------------------------------------------------------------
28 changes: 28 additions & 0 deletions conf.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
#La frequence
freq=12476
#Polarisation
pol=h
#Srate
srate=27500
#Le numero de la carte a utiliser
card=0
#Le temps d'attente pour que la carte accorde
timeout_accord=20
#La liste des chaines
#Le nombre de pid est quelconque (inferieur a 16)
ip=239.200.200.200
port=1234
name=fra_autres__EBS
pids=101 201 202 203 204 205 206 207 208 209 210 211 212 100
ip=239.200.200.201
port=1234
name=fra_X_Stream
pids=551 552 550
ip=239.200.200.202
port=1234
name=ara_2M
pids=601 602 257
ip=239.200.200.203
port=1234
name=kur_CTV_Kurdistan
pids=700 701 702
148 changes: 148 additions & 0 deletions dvb.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
/*
dvb.h dvb part (except tune) of mumudvb
mumudvb - UDP-ize a DVB transport stream.
(C) Dave Chapman <dave@dchapman.com> 2001, 2002.
Modified By Brice DUBOST
*
The latest version can be found at http://www.crans.org
Copyright notice:
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#include "dvb.h"


char *frontenddev[6] =
{ "/dev/dvb/adapter0/frontend0", "/dev/dvb/adapter1/frontend0",
"/dev/dvb/adapter2/frontend0", "/dev/dvb/adapter3/frontend0",
"/dev/dvb/adapter4/frontend0", "/dev/dvb/adapter5/frontend0"
};

char *demuxdev[6] = { "/dev/dvb/adapter0/demux0", "/dev/dvb/adapter1/demux0",
"/dev/dvb/adapter2/demux0", "/dev/dvb/adapter3/demux0",
"/dev/dvb/adapter4/demux0", "/dev/dvb/adapter5/demux0"
};

char *dvrdev[6] = { "/dev/dvb/adapter0/dvr0", "/dev/dvb/adapter1/dvr0",
"/dev/dvb/adapter2/dvr0", "/dev/dvb/adapter3/dvr0",
"/dev/dvb/adapter4/dvr0", "/dev/dvb/adapter5/dvr0"
};



int
open_fe (int *fd_frontend, int card)
{
if ((*fd_frontend = open (frontenddev[card], O_RDWR | O_NONBLOCK)) < 0)
{
perror ("FRONTEND DEVICE: ");
return -1;
}
return 1;
}



void
set_ts_filt (int fd, uint16_t pid, dmx_pes_type_t pestype)
{
struct dmx_pes_filter_params pesFilterParams;

fprintf (stderr, "Setting filter for PID %d\n", pid);
pesFilterParams.pid = pid;
pesFilterParams.input = DMX_IN_FRONTEND;
pesFilterParams.output = DMX_OUT_TS_TAP;
pesFilterParams.pes_type = pestype;
pesFilterParams.flags = DMX_IMMEDIATE_START;

if (ioctl (fd, DMX_SET_PES_FILTER, &pesFilterParams) < 0)
{
fprintf (stderr, "FILTER %i: ", pid);
perror ("DMX SET PES FILTER");
}
}


void
affiche_puissance (fds_t fds, int no_daemon)
{
int strength, ber, snr;
strength = ber = snr = 0;
if (ioctl (fds.fd_frontend, FE_READ_BER, &ber) >= 0)
if (ioctl (fds.fd_frontend, FE_READ_SIGNAL_STRENGTH, &strength) >= 0)
if (ioctl (fds.fd_frontend, FE_READ_SNR, &snr) >= 0)
{
if(!no_daemon)
syslog(LOG_USER, "Bit error rate: %10d Signal strength: %10d SNR: %10d\n", ber,strength,snr);
else
fprintf (stderr, "Bit error rate: %10d Signal strength: %10d SNR: %10d\n", ber,strength,snr);
}
}

int
create_card_fd(int card, int nb_flux, int *num_pids, fds_t *fds)
{

int i=0;
int j=0;
if ((fds->fd_zero = open (demuxdev[card], O_RDWR)) < 0) //fd_zero is the file descriptor usd to get te PMT (the number 0) pid
{
fprintf (stderr, "FD %i: ", i);
perror ("DEMUX DEVICE: ");
return -1;
}

for (i = 0; i < nb_flux; i++)
{
for(j=0;j<num_pids[i];j++)
{
if ((fds->fd[i][j] = open (demuxdev[card], O_RDWR)) < 0)
{
fprintf (stderr, "FD %i: ", i);
perror ("DEMUX DEVICE: ");
return -1;
}
}
}
if ((fds->fd_dvr = open (dvrdev[card], O_RDONLY | O_NONBLOCK)) < 0)
{
perror ("DVR DEVICE: ");
return -1;
}


return 0;

}


void
close_card_fd(int card, int nb_flux, int *num_pids, fds_t fds)
{
int i=0;
int j=0;

close (fds.fd_zero);
for (i = 0; i < nb_flux; i++)
{
for(j=0;j<num_pids[i];j++)
close (fds.fd[i][j]);
}
close (fds.fd_dvr);

}
32 changes: 32 additions & 0 deletions dvb.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
#ifndef _DVB_H
#define _DVB_H

#include <syslog.h>
#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <resolv.h>


// DVB includes:
#include <linux/dvb/dmx.h>
#include <linux/dvb/frontend.h>

#include "mumudvb.h"

typedef struct {
int fd_zero;
int fd_dvr;
int fd_frontend;
int fd[MAX_CHAINES][MAX_PIDS_PAR_CHAINE];
}fds_t;


int open_fe (int *fd_frontend, int card);
void set_ts_filt (int fd,uint16_t pid, dmx_pes_type_t pestype);
void affiche_puissance (fds_t fds, int no_daemon);
int create_card_fd(int card, int nb_flux, int *num_pids, fds_t *fds);
void close_card_fd(int card, int nb_flux, int *num_pids, fds_t fds);
#endif
Loading

0 comments on commit 5988fbe

Please sign in to comment.