Commit ff211f10 authored by Jean-Paul Saman's avatar Jean-Paul Saman

Merge branch 'master' of git://git.videolan.org/dvblast into for-videolan

The following conflicts occured because this tree originates from SVN directly, while the
tree which was merged was converted to git by others.

Conflicts:
	AUTHORS
	INSTALL
	Makefile
	NEWS
	README
	TODO
	asi.c
	comm.c
	comm.h
	demux.c
	dvb.c
	dvblast.1
	dvblast.c
	dvblast.h
	dvblast_mmi.sh
	dvblastctl.c
	en50221.c
	en50221.h
	output.c
	udp.c
	util.c
	version.h
parents 8f716be0 9d461a55
.gitattributes export-ignore
.gitignore export-ignore
*.o
dvblast
dvblastctl
# Contributors to DVBlast
# $Id$
#
# The format of this file was inspired by the Linux kernel CREDITS file.
# Authors are listed alphabetically.
......@@ -7,6 +6,10 @@
# The fields are: name (N), email (E), web-address (W), CVS account login (C),
# PGP key ID and fingerprint (P), description (D), and snail-mail address (S).
N: Georgi Chorbadzhiyski
E: gf AT unixsol.org
D: numerous bug fixes and enhancements
N: Marian Ďurkovič
E: md AT bts DOT sk
C: md
......@@ -17,6 +20,10 @@ E: a DOT j DOT gatward AT reading DOT ac DOT uk
C: gatty
D: EIT pass-through, IPv6 support, various bug fixes
N: Peter Partin
E: peter DOT martin AT tripleplay DASH servies DOT com
D: ATSC, MRTG, PID remap
N: Christophe Massiot
E: massiot AT via DOT ecp DOT fr
C: massiot
......
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.
$Id$
Installing DVBlast
==================
No autotools yet... You have to tweak the Makefile by hand, especially
if your kernel is S2API-enabled but not your distribution (indicate the
path of your kernel where appropriate). Compile the program with `make`
and install with `make install`. It requires the installation of libdvbpsi
0.1.6 or later and libdvbpsi-devel (depending on your distribution).
Compile the program with `make` and install with `make install`. Your
kernel must support DVB S2API which was merged in Linux 2.6.28 and released
on 24 Dec 2008.
DVBlast 2.X no longer requires libdvbpsi runtime and libdvbpsi-devel for
compilation. Instead you must install biTStream on your build machine (no
runtime library is needed).
To install biTStream, clone git repository and run `make install`.
git clone git://git.videolan.org/bitstream.git
cd bitstream
make install
# DVBlast Makefile
# Customise the path of your kernel
VERSION = 1.2.0
VERSION = 2.1.0
TOPDIR = `basename ${PWD}`
GIT_VER = $(shell git describe --tags --dirty --always 2>/dev/null)
CFLAGS += -Wall -O3 -fomit-frame-pointer
CFLAGS += -Wall -Wformat-security -O3 -fomit-frame-pointer
CFLAGS += -g
CFLAGS += -I/usr/src/kernel/linux-2.6.29.1/include
ifneq "$(GIT_VER)" ""
CFLAGS += -DVERSION_EXTRA=\"git-$(GIT_VER)\"
else
CFLAGS += -DVERSION_EXTRA=\"release\"
endif
LDLIBS += -lrt
LDLIBS_DVBLAST += -ldvbpsi -lpthread
LDLIBS_DVBLAST += -lpthread
OBJ_DVBLAST = dvblast.o util.o dvb.o udp.o asi.o demux.o output.o en50221.o comm.o
OBJ_DVBLAST = dvblast.o util.o dvb.o udp.o asi.o demux.o output.o en50221.o comm.o mrtg-cnt.o
OBJ_DVBLASTCTL = util.o dvblastctl.o
ifndef V
Q = @
endif
CLEAN_OBJS = dvblast dvblastctl $(OBJ_DVBLAST) $(OBJ_DVBLASTCTL)
INSTALL_BIN = dvblast dvblastctl dvblast_mmi.sh
INSTALL_MAN = dvblast.1
PREFIX ?= /usr/local
BIN = $(DESTDIR)/$(PREFIX)/bin
MAN = $(DESTDIR)/$(PREFIX)/share/man/man1
BIN = $(subst //,/,$(DESTDIR)/$(PREFIX)/bin)
MAN = $(subst //,/,$(DESTDIR)/$(PREFIX)/share/man/man1)
all: dvblast dvblastctl
$(OBJ_DVBLAST) $(OBJ_DVBLASTCTL): Makefile dvblast.h en50221.h comm.h version.h asi.h
.PHONY: clean install uninstall dist
%.o: %.c Makefile dvblast.h en50221.h comm.h version.h asi.h mrtg-cnt.h
@echo "CC $<"
$(Q)$(CC) $(CFLAGS) -c $<
dvblast: $(OBJ_DVBLAST)
$(CC) -o $@ $(OBJ_DVBLAST) $(LDLIBS_DVBLAST) $(LDLIBS)
@echo "LINK $@"
$(Q)$(CC) -o $@ $(OBJ_DVBLAST) $(LDLIBS_DVBLAST) $(LDLIBS)
dvblastctl: $(OBJ_DVBLASTCTL)
@echo "LINK $@"
$(Q)$(CC) -o $@ $(OBJ_DVBLASTCTL) $(LDLIBS_DVBLAST) $(LDLIBS)
clean:
@rm -f dvblast dvblastctl $(OBJ_DVBLAST) $(OBJ_DVBLASTCTL)
@echo "CLEAN $(CLEAN_OBJS)"
$(Q)rm -f $(CLEAN_OBJS)
install: all
@install -d $(BIN)
@install -d $(MAN)
@install dvblast dvblastctl dvblast_mmi.sh $(BIN)
@install -m 644 dvblast.1 $(MAN)
@install -d "$(BIN)"
@install -d "$(MAN)"
@echo "INSTALL $(INSTALL_MAN) -> $(MAN)"
$(Q)install -m 644 dvblast.1 "$(MAN)"
@echo "INSTALL $(INSTALL_BIN) -> $(BIN)"
$(Q)install dvblast dvblastctl dvblast_mmi.sh "$(BIN)"
uninstall:
@rm $(BIN)/dvblast $(BIN)/dvblastctl $(BIN)/dvblast_mmi.sh $(MAN)/dvblast.1
@-for FILE in $(INSTALL_BIN); do \
echo "RM $(BIN)/$$FILE"; \
rm "$(BIN)/$$FILE"; \
done
@-for FILE in $(INSTALL_MAN); do \
echo "RM $(MAN)/$$FILE"; \
rm "$(MAN)/$$FILE"; \
done
dist:
( cd ../ && \
tar -cj --exclude-vcs --exclude $(TOPDIR)/*.tar.bz2 $(TOPDIR)/ > $(TOPDIR)/dvblast-$(VERSION).tar.bz2 )
dist: clean
@echo "ARCHIVE dvblast-$(VERSION).tar.bz2"
$(Q)git archive --format=tar --prefix=dvblast-$(VERSION)/ master | bzip2 -9 > dvblast-$(VERSION).tar.bz2
$(Q)ls -l dvblast-$(VERSION).tar.bz2
$Id$
Changes between 2.1 and 2.2:
----------------------------
* Fixed a regression that prevented ECM pass-through (-Y) from working.
* Handle ECM pids that are described in PMT ES descriptor loop.
Changes between 2.0 and 2.1:
----------------------------
* Fix MMI menus which were accidentally broken in 2.0
* Remove ecm and emm output options because they weren't working
* Better handling of changed PSI tables with same version number
Changes between 1.2 and 1.3:
Changes between 1.2 and 2.0:
----------------------------
* Fix latency and potential packet loss during CAM communication
* Add optional kernel patches for lower latency
* Smooth packet output with an extra buffer
* libdvbpsi runtime is no longer needed; biTStream development library
is used instead
* Add the ability to bind to a specific network interface
* Add a configurable MTU
* Add support for NIT in DVB compliance mode
* Syslog support with -l option
* Override FEC Inner with -F option
* Override Rolloff with -R option
* Override tuning parameters with new options
* Output all PMTs with -w, all ESs (even unknown) for a program with -z
* Add support for ECM and EMM packets pass-through
* Fix diseqc command with high-band tranponders
* Add basic support for ATSC
* Add support for MRTG statistics
* Add detailed information for TS errors
* Add support for getting PAT/CAT/NIT/SDT tables in dvblastctl
* Add support for getting PMT table for chosen service in dvblastctl
* Add support for getting PID information (bps, error counters and more)
* Add support for setting service name and provider name per output
* Command socket is usable with any input (ASI, DVB, UDP), previously
only DVB input worked
Changes between 1.1 and 1.2:
----------------------------
......
$Id$
Welcome to DVBlast!
===================
......@@ -13,7 +11,7 @@ It outputs one or several RTP streams carrying transport streams with:
- hardware or software PID filtering
- PID-based or service-based demultiplexing
- optional descrambling via CAM device
- EIT, SDT and TDT pass-through for EPG information<
- optional DVB tables
DVBlast is written to be the core of a custom IRD, CID,or ASI gateway,
based on a PC with a Linux-supported card. It is very lightweight and
......@@ -24,9 +22,10 @@ Current features
================
- Lightweight program designed for extreme memory and CPU conditions
- Only one dependancy: libdvbpsi
- No runtime dependancy; one build dependancy (biTStream)
- CAM menus (MMI) support via an external application
- The configuration file describing outputs can be reloaded without losing a single packet
- The configuration file describing outputs can be reloaded without losing
a single packet
- Support for the new S2API of linux-dvb
- IPv6 network support
- UDP rather than RTP output for IPTV STBs which don't support RTP
......@@ -48,6 +47,15 @@ Please note that frequencies are in kHz for DVB-S/S2/C, but Hz for DVB-T.
Symbol rates are in symbols/s, and bandwidths in MHz. If you have several
linux-dvb cards in the machine, specify which one to use with -a.
You generally want to run DVBlast in DVB compliance mode with option -C.
This option will pass through or generate mandatory DVB tables (NIT, SDT,
EITp/f, TOT, TDT). If you also want to pass-through the EIT schedule tables,
use the -e switch. It is considered a good practice to configure the name
of the network (for the NIT) with the -M option.
If you don't want to set these options on a general basis, you can set them
per output - see below.
Other rarely used options are available - run dvblast -h for more
information.
......@@ -55,6 +63,11 @@ information.
Alternative inputs
==================
DVBlast may handle several DVB adapters in the same machine with the -a switch:
-a 3 will use /dev/dvb/adapter3. Additionally, selecting between frontends on
a single card is supported with the -n switch. This is useful for hybrid
DVB/S + DVB/T cards.
If you own a Computer Modules DVB-ASI input card, you can have DVBlast
filter and demultiplex the inputs. You just need to specify the slot number
with -A.
......@@ -65,13 +78,25 @@ instance a multi-program transport stream. The address is specified with
such a stream for instance to cross network boundaries between the
receivers and the target network.
The syntax of the -D option is:
[<src host>[:<src port>]@]<src mcast>[:<port>][/<opts>]*
where <src mcast> is the multicast address carrying the stream, and <src
host> is optionally the address of the source, for source-specific multicast.
Options include:
/udp (for streams without an RTP header)
/mtu=XXXX (sets the maximum UDP packet size)
/ifindex=X (binds to a specific network interface, by link number)
/ifaddr=XXX.XXX.XXX.XXX (binds to a specific network interface, by address)
For example:
-D 239.255.0.2:1234/udp/ifindex=1
Configuring outputs
===================
DVBlast reads a configuration file containing one or several lines in the
format :
<IP>[:<port>][/udp] <always on> <SID> [<PID>,]*
<IP>[:<port>][@<IP>[:<port>]][/<option>]* <always on> <SID> [<PID>,]*
For instance :
239.255.0.1:1234 1 10750 1234,1235,1236
......@@ -96,6 +121,28 @@ regularly reset the CAM module if it fails to descramble the service,
assuming the module is dead. Every time it is reset a few TS packets
will be lost, that is why this feature is optional.
Other options can be set by appending / to the multicast address definition.
Available options include :
/udp (turns on -U for a specific output)
/dvb (turns on -C for a specific output)
/epg (turns on -C -e for a specific output)
/tsid=XXX (sets the transport stream ID)
/ssrc=XXX.XXX.XXX.XXX (sets the RTP synchronization source IPv4)
/retention=XXX (see -E)
/latency=XXX (see -L)
/ttl=XX (see -t)
/tos=XX (sets the IPv4 Type Of Service option)
/mtu=XXXX (sets the maximum UDP packet size)
/srvname=Some_Channel (set service name in SDT)
/srvprovider=Some_Provider (set provider name in SDT)
When setting text options like /srvname or /srvprovider, remember
that the underscore character (_) will be replaced by space ( ).
Several options can be appended, for instance:
239.255.0.1:1234/udp/epg/tsid=42/ssrc=192.168.0.1
The optional "/udp" parameter can be used to force DVBlast to output
raw UDP stream. This functionality is provided for backwards compatibility
with IPTV set top boxes that don't support RTP and should only be used
......@@ -140,6 +187,52 @@ from the command-line :
dvblast -c /tmp/dvblast.conf
Buffering
=========
DVB cards usually output packets in big chunks. This can be problematic
with low bitrate multiplexes. By default, DVBlast bufferizes 200 ms
and tries to smooth the output. It may be desired to change this value
with the -L option. The appropriate value for the output latency should be :
chunk_size / multiplex_bitrate
The chunk size for saa7146-based cards is 512000 bits ; for
cx23885-based cards is 192512 bits. The chunk size can be modified with
an appropriate kernel patch (see extra/). The multiplex_bitrate depends
on the symbol rate and many other factors such as the modulation.
The current default value allows for multiplex_rates as low as 2.56 Mbi/s.
Smaller multiplexes are rare but exist, so in that case you may want to
increase the buffer size. A typical DVB multiplex is 30 or 40 Mbi/s, so
the default introduces a superfluous latency ; the buffer can be lowered
to 50 ms if latency is an issue.
DVBlast also has another parameter called "max retention time" (-E).
This controls how TS packets are grouped together in IP datagrams : the
difference between the theorical output times of the first and the last
TS packets cannot exceed the maximal retention time.
IP datagrams are normally output at the output time of the earliest TS
packet ; it implies that the next TS packets are sent too soon and must
be buffered at the receiver level. ISO/IEC 13818-1 makes no provision for
this, since IP wasn't in mind when designing TS, so in theory we risk a
buffer overflow.
However normal IP receivers feature a jitter buffer which can absorb the
overflow ; DVB recommends a 50 ms buffer. DVBlast's default maximal
retention time is just below, at 40 ms, which should be fine in most
situations.
If some anal set-top-box complains about buffer overflows or clock issues,
you may try to lower the value ; the drawback is that on low bitrate
streams it will introduce padding. People with low bitrate streams and
nice receivers with big buffers can raise this value to avoid superfluous
padding and lower the total bitrate.
Please bear in mind though that setting a value for max retention time
greater than the output latency has no effect.
Monitoring
==========
......@@ -163,11 +256,6 @@ dvblast_mmi.sh -r /tmp/dvblast.sock
Advanced features
=================
DVBlast may handle several DVB adapters in the same machine with the -a switch:
-a 3 will use /dev/dvb/adapter3. Additionally, selecting between frontends on
a single card is supported with the -n switch. This is useful for hybrid
DVB/S + DVB/T cards.
For better latency, run DVBlast in real-time priority: -i 1 (requires root
privileges).
......@@ -179,7 +267,7 @@ Note that IPv6 addresses specified on command line may need to have the square
brackets escaped (\[ and \]), depending on your shell.
The -u switch disables the PID filters, so that all PIDs, even the
unused ones, can be output. With -e, dvblast also streams EIT and SDT packets
for the related services.
unused ones, can be output.
Other options are self-understandable, and are listed in dvblast -h.
- Test and enhance the API for DVB-C, H, and ATSC support
- Win32 support
- Improve build system (autostuff)
- Rework the EN 50 221 machinery to avoid blocking TPDU_Recv and Send
......@@ -2,7 +2,6 @@
* asi.c: support for Computer Modules ASI cards
*****************************************************************************
* Copyright (C) 2004, 2009 VideoLAN
* $Id: asi.c 9 2007-03-15 16:58:05Z cmassiot $
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
......@@ -18,13 +17,14 @@
*
* 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
......@@ -37,6 +37,8 @@
#include <arpa/inet.h>
#include <errno.h>
#include <bitstream/common.h>
#include "asi.h"
#include "dvblast.h"
......@@ -55,10 +57,12 @@
#define ASI_DEVICE "/dev/asirx%u"
#define ASI_TIMESTAMPS_FILE "/sys/class/asi/asirx%u/timestamps"
#define ASI_BUFSIZE_FILE "/sys/class/asi/asirx%u/bufsize"
#define ASI_LOCK_TIMEOUT 5000000 /* 5 s */
static int i_handle;
static int i_bufsize;
static uint8_t p_pid_filter[8192 / 8];
static mtime_t i_last_packet = 0;
/*****************************************************************************
* Local helpers
......@@ -167,82 +171,119 @@ void asi_Open( void )
/*****************************************************************************
* asi_Read : read packets from the device
*****************************************************************************/
block_t *asi_Read( void )
block_t *asi_Read( mtime_t i_poll_timeout )
{
int i, i_len;
struct iovec p_iov[i_bufsize / TS_SIZE];
block_t *p_ts, **pp_current = &p_ts;
struct pollfd pfd[2];
int i_ret, i_nb_fd = 1;
for ( ; ; )
pfd[0].fd = i_handle;
pfd[0].events = POLLIN;
if ( i_comm_fd != -1 )
{
struct pollfd pfd;
pfd[1].fd = i_comm_fd;
pfd[1].events = POLLIN;
i_nb_fd++;
}
pfd.fd = i_handle;
pfd.events = POLLIN | POLLPRI;
i_ret = poll( pfd, i_nb_fd, (i_poll_timeout + 999) / 1000 );
if ( poll(&pfd, 1, -1) < 0 )
{
i_wallclock = mdate();
if ( i_ret < 0 )
{
if( errno != EINTR )
msg_Err( NULL, "couldn't poll from device " ASI_DEVICE " (%s)",
i_asi_adapter, strerror(errno) );
continue;
return NULL;
}
if ( (pfd[0].revents & POLLPRI) )
{
unsigned int i_val;
if ( ioctl(i_handle, ASI_IOC_RXGETEVENTS, &i_val) < 0 )
msg_Err( NULL, "couldn't RXGETEVENTS (%s)", strerror(errno) );
else
{
if ( i_val & ASI_EVENT_RX_BUFFER )
msg_Warn( NULL, "driver receive buffer queue overrun" );
if ( i_val & ASI_EVENT_RX_FIFO )
msg_Warn( NULL, "onboard receive FIFO overrun" );
if ( i_val & ASI_EVENT_RX_CARRIER )
msg_Warn( NULL, "carrier status change" );
if ( i_val & ASI_EVENT_RX_LOS )
msg_Warn( NULL, "loss of packet synchronization" );
if ( i_val & ASI_EVENT_RX_AOS )
msg_Warn( NULL, "acquisition of packet synchronization" );
if ( i_val & ASI_EVENT_RX_DATA )
msg_Warn( NULL, "receive data status change" );
}
}
if ( (pfd.revents & POLLPRI) )
if ( (pfd[0].revents & POLLIN) )
{
struct iovec p_iov[i_bufsize / TS_SIZE];
block_t *p_ts, **pp_current = &p_ts;
int i, i_len;
if ( !i_last_packet )
{
unsigned int i_val;
if ( ioctl(i_handle, ASI_IOC_RXGETEVENTS, &i_val) < 0 )
msg_Err( NULL, "couldn't RXGETEVENTS (%s)", strerror(errno) );
else
{
if ( i_val & ASI_EVENT_RX_BUFFER )
msg_Warn( NULL, "driver receive buffer queue overrun" );
if ( i_val & ASI_EVENT_RX_FIFO )
msg_Warn( NULL, "onboard receive FIFO overrun" );
if ( i_val & ASI_EVENT_RX_CARRIER )
msg_Warn( NULL, "carrier status change" );
if ( i_val & ASI_EVENT_RX_LOS )
msg_Warn( NULL, "loss of packet synchronization" );
if ( i_val & ASI_EVENT_RX_AOS )
msg_Warn( NULL, "acquisition of packet synchronization" );
if ( i_val & ASI_EVENT_RX_DATA )
msg_Warn( NULL, "receive data status change" );
switch (i_print_type) {
case PRINT_XML:
printf("<STATUS type=\"lock\" status=\"1\"/>\n");
break;
default:
printf("frontend has acquired lock\n" );
}
}
i_last_packet = i_wallclock;
if ( (pfd.revents & POLLIN) )
break;
}
for ( i = 0; i < i_bufsize / TS_SIZE; i++ )
{
*pp_current = block_New();
p_iov[i].iov_base = (*pp_current)->p_ts;
p_iov[i].iov_len = TS_SIZE;
pp_current = &(*pp_current)->p_next;
}
for ( i = 0; i < i_bufsize / TS_SIZE; i++ )
{
*pp_current = block_New();
p_iov[i].iov_base = (*pp_current)->p_ts;
p_iov[i].iov_len = TS_SIZE;
pp_current = &(*pp_current)->p_next;
}
if ( (i_len = readv(i_handle, p_iov, i_bufsize / TS_SIZE)) < 0 )
{
msg_Err( NULL, "couldn't read from device " ASI_DEVICE " (%s)",
i_asi_adapter, strerror(errno) );
i_len = 0;
}
i_len /= TS_SIZE;
if ( (i_len = readv(i_handle, p_iov, i_bufsize / TS_SIZE)) < 0 )
{
msg_Err( NULL, "couldn't read from device " ASI_DEVICE " (%s)",
i_asi_adapter, strerror(errno) );
i_len = 0;
}
i_len /= TS_SIZE;
pp_current = &p_ts;
while ( i_len && *pp_current )
{
pp_current = &(*pp_current)->p_next;
i_len--;
}
if ( *pp_current )
msg_Dbg( NULL, "partial buffer received" );
block_DeleteChain( *pp_current );
*pp_current = NULL;
pp_current = &p_ts;
while ( i_len && *pp_current )
return p_ts;
}
else if ( i_last_packet && i_last_packet + ASI_LOCK_TIMEOUT < i_wallclock )
{
pp_current = &(*pp_current)->p_next;
i_len--;
switch (i_print_type) {
case PRINT_XML:
printf("<STATUS type=\"lock\" status=\"0\"/>\n");
break;
default:
printf("frontend has lost lock\n" );
}
i_last_packet = 0;
}
if ( *pp_current )
msg_Dbg( NULL, "partial buffer received" );
block_DeleteChain( *pp_current );
*pp_current = NULL;
if ( i_comm_fd != -1 && pfd[1].revents )
comm_Read();
return p_ts;
return NULL;
}
/*****************************************************************************
......@@ -251,7 +292,7 @@ block_t *asi_Read( void )
int asi_SetFilter( uint16_t i_pid )
{
#ifdef USE_HARDWARE_FILTERING
p_pid_filter[ i_pid / 8 ] |= (0x01 << (i_pid % 8));
p_pid_filter[ i_pid / 8 ] |= (0x01 << (i_pid % 8));
if ( ioctl( i_handle, ASI_IOC_RXSETPF, p_pid_filter ) < 0 )
msg_Warn( NULL, "couldn't add filter on PID %u", i_pid );
......@@ -267,8 +308,17 @@ int asi_SetFilter( uint16_t i_pid )
void asi_UnsetFilter( int i_fd, uint16_t i_pid )
{
#ifdef USE_HARDWARE_FILTERING
p_pid_filter[ i_pid / 8 ] &= ~(0x01 << (i_pid % 8));
p_pid_filter[ i_pid / 8 ] &= ~(0x01 << (i_pid % 8));
if ( ioctl( i_handle, ASI_IOC_RXSETPF, p_pid_filter ) < 0 )
msg_Warn( NULL, "couldn't remove filter on PID %u", i_pid );
#endif
}
/*****************************************************************************
* asi_Reset
*****************************************************************************/
void asi_Reset( void )
{
msg_Warn( NULL, "asi_Reset() do nothing" );
}
......@@ -2,29 +2,21 @@
* comm.c: Handles the communication socket (linux-dvb only)
*****************************************************************************
* Copyright (C) 2008 VideoLAN
* $Id$
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
* 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* This program is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*****************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
......@@ -48,8 +40,7 @@ int i_comm_fd = -1;
*****************************************************************************/
void comm_Open( void )
{
int i_mask;
int i_size = 65535;
int i_size = COMM_MAX_MSG_CHUNK;
struct sockaddr_un sun_server;
if ( (i_comm_fd = socket( AF_UNIX, SOCK_DGRAM, 0 )) == -1 )
......@@ -64,18 +55,15 @@ void comm_Open( void )
sun_server.sun_family = AF_UNIX;
strncpy( sun_server.sun_path, psz_srv_socket, sizeof(sun_server.sun_path) );
sun_server.sun_path[sizeof(sun_server.sun_path) - 1] = '\0';
i_mask = umask(077);
if ( bind( i_comm_fd, (struct sockaddr *)&sun_server,
SUN_LEN(&sun_server) ) < 0 )
{
msg_Err( NULL, "cannot bind comm socket (%s)", strerror(errno) );
umask( i_mask );
close( i_comm_fd );
i_comm_fd = -1;
return;
}
umask( i_mask );
}
/*****************************************************************************
......@@ -88,12 +76,16 @@ void comm_Read( void )
ssize_t i_size, i_answer_size = 0;
uint8_t p_buffer[COMM_BUFFER_SIZE], p_answer[COMM_BUFFER_SIZE];
uint8_t i_command, i_answer;
uint8_t *p_packed_section;
unsigned int i_packed_section_size;
uint8_t *p_input = p_buffer + COMM_HEADER_SIZE;
uint8_t *p_output = p_answer + COMM_HEADER_SIZE;
i_size = recvfrom( i_comm_fd, p_buffer, COMM_BUFFER_SIZE, 0,
(struct sockaddr *)&sun_client, &sun_length );
if ( i_size < COMM_HEADER_SIZE )
{
msg_Err( NULL, "cannot read comm socket (%d:%s)\n", i_size,
msg_Err( NULL, "cannot read comm socket (%zd:%s)\n", i_size,
strerror(errno) );
return;
}
......@@ -111,10 +103,28 @@ void comm_Read( void )
i_command = p_buffer[1];
if ( i_frequency == 0 ) /* ASI or UDP, disable DVB only commands */
{
switch ( i_command )
{
case CMD_FRONTEND_STATUS:
case CMD_MMI_STATUS:
case CMD_MMI_SLOT_STATUS:
case CMD_MMI_OPEN:
case CMD_MMI_CLOSE:
case CMD_MMI_RECV:
case CMD_MMI_SEND_TEXT:
case CMD_MMI_SEND_CHOICE:
i_answer = RET_NODATA;
i_answer_size = 0;
goto return_answer;
}
}
switch ( i_command )
{
case CMD_RELOAD:
b_hup_received = 1;
b_conf_reload = 1;
i_answer = RET_OK;
i_answer_size = 0;
break;
......@@ -130,39 +140,125 @@ void comm_Read( void )
break;
case CMD_MMI_SLOT_STATUS:
i_answer = en50221_StatusMMISlot( p_buffer + COMM_HEADER_SIZE,
i_size - COMM_HEADER_SIZE,
i_answer = en50221_StatusMMISlot( p_input, i_size - COMM_HEADER_SIZE,
p_answer + COMM_HEADER_SIZE,
&i_answer_size );
break;
case CMD_MMI_OPEN:
i_answer = en50221_OpenMMI( p_buffer + COMM_HEADER_SIZE,
i_size - COMM_HEADER_SIZE );
i_answer = en50221_OpenMMI( p_input, i_size - COMM_HEADER_SIZE );
break;
case CMD_MMI_CLOSE:
i_answer = en50221_CloseMMI( p_buffer + COMM_HEADER_SIZE,
i_size - COMM_HEADER_SIZE );
i_answer = en50221_CloseMMI( p_input, i_size - COMM_HEADER_SIZE );
break;
case CMD_MMI_RECV:
i_answer = en50221_GetMMIObject( p_buffer + COMM_HEADER_SIZE,
i_size - COMM_HEADER_SIZE,
i_answer = en50221_GetMMIObject( p_input, i_size - COMM_HEADER_SIZE,
p_answer + COMM_HEADER_SIZE,
&i_answer_size );
break;
case CMD_MMI_SEND:
i_answer = en50221_SendMMIObject( p_buffer + COMM_HEADER_SIZE,
i_size - COMM_HEADER_SIZE );
case CMD_MMI_SEND_TEXT:
case CMD_MMI_SEND_CHOICE:
i_answer = en50221_SendMMIObject( p_input, i_size - COMM_HEADER_SIZE );
break;
case CMD_SHUTDOWN:
msg_Err( NULL, "shutdown via comm" );
exit(EXIT_SUCCESS);
/* this is a bit violent, but hey, closing everything cleanly
* would do approximately the same */
b_exit_now = 1;
i_answer = RET_OK;
i_answer_size = 0;
break;
case CMD_GET_PAT:
case CMD_GET_CAT:
case CMD_GET_NIT:
case CMD_GET_SDT:
{
#define CASE_TABLE(x) \
case CMD_GET_##x: \
{ \
i_answer = RET_##x; \
p_packed_section = demux_get_current_packed_##x(&i_packed_section_size); \
break; \
}
switch ( i_command )
{
CASE_TABLE(PAT)
CASE_TABLE(CAT)
CASE_TABLE(NIT)
CASE_TABLE(SDT)
}
#undef CASE_TABLE
if ( p_packed_section && i_packed_section_size )
{
if ( i_packed_section_size <= COMM_BUFFER_SIZE - COMM_HEADER_SIZE )
{
i_answer_size = i_packed_section_size;
memcpy( p_answer + COMM_HEADER_SIZE, p_packed_section, i_packed_section_size );
} else {
msg_Err( NULL, "section size is too big (%u)\n", i_packed_section_size );
i_answer = RET_NODATA;
}
free( p_packed_section );
} else {
i_answer = RET_NODATA;
}
break;
}
case CMD_GET_PMT:
{
if ( i_size < COMM_HEADER_SIZE + 2 )
{
msg_Err( NULL, "command packet is too short (%zd)\n", i_size );
return;
}
uint16_t i_sid = (uint16_t)((p_input[0] << 8) | p_input[1]);
p_packed_section = demux_get_packed_PMT(i_sid, &i_packed_section_size);
if ( p_packed_section && i_packed_section_size )
{
i_answer = RET_PMT;
i_answer_size = i_packed_section_size;
memcpy( p_answer + COMM_HEADER_SIZE, p_packed_section, i_packed_section_size );
free( p_packed_section );
} else {
i_answer = RET_NODATA;
}
break;
}
case CMD_GET_PIDS:
{
i_answer = RET_PIDS;
i_answer_size = sizeof(struct cmd_pid_info);
demux_get_PIDS_info( p_output );
break;
}
case CMD_GET_PID:
{
if ( i_size < COMM_HEADER_SIZE + 2 )
{
msg_Err( NULL, "command packet is too short (%zd)\n", i_size );
return;
}
uint16_t i_pid = (uint16_t)((p_input[0] << 8) | p_input[1]);
if ( i_pid >= MAX_PIDS ) {
i_answer = RET_NODATA;
} else {
i_answer = RET_PID;
i_answer_size = sizeof(ts_pid_info_t);
demux_get_PID_info( i_pid, p_output );
}
break;
}
default:
msg_Err( NULL, "wrong command %u", i_command );
......@@ -171,14 +267,33 @@ void comm_Read( void )
break;
}
return_answer:
p_answer[0] = COMM_HEADER_MAGIC;
p_answer[1] = i_answer;
p_answer[2] = 0;
p_answer[3] = 0;
msg_Dbg( NULL, "answering %d to %d with size %d", i_answer, i_command,
uint32_t *p_size = (uint32_t *)&p_answer[4];
*p_size = i_answer_size + COMM_HEADER_SIZE;
msg_Dbg( NULL, "answering %d to %d with size %zd", i_answer, i_command,
i_answer_size );
if ( sendto( i_comm_fd, p_answer, i_answer_size + COMM_HEADER_SIZE, 0,
(struct sockaddr *)&sun_client, sun_length ) < 0 )
msg_Err( NULL, "cannot send comm socket (%s)", strerror(errno) );
#define min(a, b) (a < b ? a : b)
ssize_t i_sended = 0;
ssize_t i_to_send = i_answer_size + COMM_HEADER_SIZE;
do {
ssize_t i_sent = sendto( i_comm_fd, p_answer + i_sended,
min(i_to_send, COMM_MAX_MSG_CHUNK), 0,
(struct sockaddr *)&sun_client, sun_length );
if ( i_sent < 0 ) {
msg_Err( NULL, "cannot send comm socket (%s)", strerror(errno) );
break;
}
i_sended += i_sent;
i_to_send -= i_sent;
} while ( i_to_send > 0 );
#undef min
>>>>>>> 9d461a5542117d8ec914b2572b3d1a6a2a9636e0
}
......@@ -2,23 +2,14 @@
* comm.h
*****************************************************************************
* Copyright (C) 2008 VideoLAN
* $Id$
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
* 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* This program is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*****************************************************************************/
/* DVB Card Drivers */
......@@ -27,28 +18,53 @@
#include <linux/dvb/frontend.h>
#include <linux/dvb/ca.h>
#define COMM_BUFFER_SIZE 4096
#define COMM_HEADER_SIZE 4
#define COMM_HEADER_MAGIC 0x48
#include <bitstream/mpeg/psi.h>
#define COMM_HEADER_SIZE 8
#define COMM_BUFFER_SIZE (COMM_HEADER_SIZE + ((PSI_PRIVATE_MAX_SIZE + PSI_HEADER_SIZE) * (PSI_TABLE_MAX_SECTIONS / 2)))
#define COMM_HEADER_MAGIC 0x49
#define COMM_MAX_MSG_CHUNK 65535
#define CMD_RELOAD 1
#define CMD_SHUTDOWN 2
#define CMD_FRONTEND_STATUS 3
#define CMD_MMI_STATUS 4
#define CMD_MMI_SLOT_STATUS 5 /* arg: slot */
#define CMD_MMI_OPEN 6 /* arg: slot */
#define CMD_MMI_CLOSE 7 /* arg: slot */
#define CMD_MMI_RECV 8 /* arg: slot */
#define CMD_MMI_SEND 9 /* arg: slot, en50221_mmi_object_t */
typedef enum {
CMD_INVALID = 0,
CMD_RELOAD = 1,
CMD_SHUTDOWN = 2,
CMD_FRONTEND_STATUS = 3,
CMD_MMI_STATUS = 4,
CMD_MMI_SLOT_STATUS = 5, /* arg: slot */
CMD_MMI_OPEN = 6, /* arg: slot */
CMD_MMI_CLOSE = 7, /* arg: slot */
CMD_MMI_RECV = 8, /* arg: slot */
CMD_GET_PAT = 10,
CMD_GET_CAT = 11,
CMD_GET_NIT = 12,
CMD_GET_SDT = 13,
CMD_GET_PMT = 14, /* arg: service_id (uint16_t) */
CMD_GET_PIDS = 15,
CMD_GET_PID = 16, /* arg: pid (uint16_t) */
CMD_MMI_SEND_TEXT = 17, /* arg: slot, en50221_mmi_object_t */
CMD_MMI_SEND_CHOICE = 18, /* arg: slot, en50221_mmi_object_t */
} ctl_cmd_t;
#define RET_OK 0
#define RET_ERR 1
#define RET_FRONTEND_STATUS 2
#define RET_MMI_STATUS 3
#define RET_MMI_SLOT_STATUS 4
#define RET_MMI_RECV 5
#define RET_MMI_WAIT 6
#define RET_HUH 255
typedef enum {
RET_OK = 0,
RET_ERR = 1,
RET_FRONTEND_STATUS = 2,
RET_MMI_STATUS = 3,
RET_MMI_SLOT_STATUS = 4,
RET_MMI_RECV = 5,
RET_MMI_WAIT = 6,
RET_NODATA = 7,
RET_PAT = 8,
RET_CAT = 9,
RET_NIT = 10,
RET_SDT = 11,
RET_PMT = 12,
RET_PIDS = 13,
RET_PID = 14,
RET_HUH = 255,
} ctl_cmd_answer_t;
struct ret_frontend_status
{
......@@ -77,3 +93,8 @@ struct cmd_mmi_send
uint8_t i_slot;
en50221_mmi_object_t object;
};
struct cmd_pid_info
{
ts_pid_info_t pids[MAX_PIDS];
};
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
.TH DVBLAST "1" "January 2010" "DVBlast 1.3" "User Commands"
.TH DVBLAST "1" "January 2010" "DVBlast 2.1" "User Commands"
.SH NAME
DVBlast \- Simple and powerful dvb streaming application
.SH SYNOPSIS
.B dvblast
[\fI-q\fR] \fI-c <config_file>\fR [\fI-r <remote_socket>\fR] [\fI-t <ttl>\fR] [\fI-o <SSRC_IP>\fR] [\fI-i <RT_priority>\fR] [\fI-a <adapter>\fR] [\fI-n <frontend number>\fR] [\fI-S <diseqc>\fR] \fI-f <frequency>\fR [\fI-F <fec inner>\fR] [\fI-R <rolloff>\fR] ] [\fI-s <symbol_rate>\fR] [\fI-v <0|13|18>\fR] [\fI-p\fR] [\fI-b <bandwidth>\fR] [\fI-m <modulation\fR] [\fI-u\fR] [\fI-W\fR] [\fI-U\fR] [\fI-d <dest_IP:port>\fR] [\fI-e\fR] [\fI-T\fR] [\fI-l\fR]
[\fI-q\fR] [\fI-c <config_file>\fR] [\fI-r <remote_socket>\fR] [\fI-t <ttl>\fR] [\fI-o <SSRC_IP>\fR]
[\fI-i <RT_priority>\fR] [\fI-a <adapter>\fR] [\fI-n <frontend_number>\fR] [\fI-S <diseqc>\fR]
[\fI-f <frequency>\fR] [\fI-D <src_host>[:<src_port>][[@<src_mcast>][:<port>]][/<opts>]\fR] [\fI-A <ASI_adapter>\fR]
[\fI-s <symbol_rate>\fR] [\fI-v <0|13|18>\fR] [\fI-p\fR] [\fI-b <bandwidth>\fR] [\fI-I <inversion>\fR]
[\fI-F <fec_inner>\fR] [\fI-m <modulation>\fR] [\fI-R <rolloff>\fR] [\fI-P <pilot>\fR] [\fI-K <fec_lp>\fR]
[\fI-G <guard_interval>\fR] [\fI-H <hierarchy>\fR] [\fI-X <transmission>\fR] [\fI-O <lock_timeout>\fR]
[\fI-u\fR] [\fI-w\fR] [\fI-U\fR] [\fI-L <latency>\fR] [\fI-E <retention>\fR] [\fI-d <dest_IP>[<:port>][/<opts>]\fR]
[\fI-z\fR] [\fI-C\fR] [\fI-e\fR] [\fI-M <network_name>\fR] [\fI-N <network_ID>\fR] [\fI-T\fR] [\fI-j <system_charset>\fR]
[\fI-W\fR] [\fI-Y\fR] [\fI-l\fR] [\fI-g <logger ident>\fR] [\fI-Z <mrtg_file>\fR] [\fI-V\fR] [\fI-h\fR]
[\fI-J <DVB_charset>\fR] [\fI-B <provider_name>\fR] [\fI-Q <quit_timeout>\fR] [\fI-x <text|xml>\fR]
.SH DESCRIPTION
DVBlast is a simple and powerful streaming application based on the linux-dvb API.
It opens a DVB device, tunes it, places PID filters, configures a CAM module, and demultiplexes the packets to several RTP outputs.
DVBlast is a simple and powerful streaming application based on the linux-dvb
API. It opens a DVB device, tunes it, places PID filters, configures a CAM
module, and demultiplexes the packets to several RTP outputs.
DVBlast is designed to be the core of a custom IRD or CID, based on a PC with Linux-supported DVB cards.
DVBlast is designed to be the core of a custom IRD or CID, based on a PC with
Linux-supported DVB cards.
DVBlast does not do any kind of processing on the elementary streams, such as transcoding, PID remapping or remultiplexing. it does not stream from plain files, only DVB devices. If you were looking for these features, switch to VLC.
DVBlast does not do any kind of processing on the elementary streams, such as
transcoding, PID remapping or remultiplexing. it does not stream from plain
files, only DVB devices. If you were looking for these features, switch to VLC.
.SH OPTIONS
.PP
.TP
......@@ -23,35 +36,77 @@ Read packets from an ASI adapter (0-n)
\fB\-b\fR, \fB\-\-bandwidth\fR <bandwidth>
Frontend bandwidth
.TP
\fB\-B\fR, \fB\-\-provider-name\fR <name>
Service provider name to declare in the SDT. If you want to change
provider name per output use /srvprovider= output option in the config
file.
.TP
\fB\-c\fR, \fB\-\-config\-file\fR <config file>
Use the given configuration file
.TP
\fB\-C\fR, \fB\-\-dvb-compliance\fR
Pass through or build the mandatory DVB tables
.TP
\fB\-d\fR, \fB\-\-duplicate\fR <dest IP:port>
Duplicate all received packets to a given destination
.TP
\fB\-D\fR, \fB\-\-rtp\-input\fR
Read packets from a multicast address instead of a DVB card
.TP
\fB\-W\fR, \fB\-\-emm\-passthrough\fR
Enable EMM pass through (CA system data)
.TP
\fB\-Y\fR, \fB\-\-ecm\-passthrough\fR
Enable ECM pass through (CA program data)
.TP
\fB\-e\fR, \fB\-\-epg\-passthrough\fR
Enable EPG pass through (EIT data)
.TP
\fB\-E\fR, \fB\-\-retention\fR <retention>
Maximum retention allowed between input and output (default: 40 ms)
.TP
\fB\-f\fR, \fB\-\-frequency\fR <frequency>
Frontend frequency
.TP
\fB\-F\fr, \fB\-\-fec\-inner\fR
\fB\-F\fR, \fB\-\-fec\-inner\fR <FEC>
Forward Error Correction used by satellite (FEC Inner)
.br
DVB-S2 0|12|23|34|35|56|78|89|910|999 (default auto: 999)
.TP
\fB\-G\fR, \fB\-\-guard\fR <interval>
DVB-T guard interval
.br
DVB-T 32 (1/32)|16 (1/16)|8 (1/8)|4 (1/4)|-1 (auto, default)
.TP
\fB\-h\fR, \fB\-\-help\fR
Print the help message
.TP
\fB\-l\fR, \fB\-\-logger\fR
Send messages to syslog instead of stderr
\fB\-H\fR, \fB\-\-hierarchy\fR <hierarchy>
DVB-T hierarchy (0, 1, 2, 4 or -1 auto, default)
.TP
\fB\-i\fR, \fB\-\-priority\fR <RT priority>
Real time priority
.TP
Inversion (-1 auto, 0 off, 1 on)
.TP
\fB\-j\fR, \fB\-\-system-charset\fR <charset>
Character set used for printing messages (default UTF-8)
.TP
\fB\-J\fR, \fB\-\-dvb-charset\fR <charset>
Character set used in output DVB tables (default ISO_8859-1)
.TP
\fB\-K\fR, \fB\-\-fec-lp\fR
DVB-T low priority FEC (default auto)
.TP
\fB\-l\fR, \fB\-\-logger\fR
Send messages to syslog instead of stderr
.TP
\fB\-g\fR, \fB\-\-logger-ident\fR <logger_ident>
Set the program name that will appear in syslog (default: dvblast /the executable name/).
.TP
\fB\-L\fR, \fB\-\-latency\fR <latency>
Maximum latency allowed between input and output (default: 100 ms)
.TP
\fB\-m\fR, \fB\-\-modulation\fR
Modulation
.br
......@@ -61,18 +116,33 @@ DVB-T qam_16|qam_32|qam_64|qam_128|qam_256 (default qam_auto)
.br
DVB-S2 qpsk|psk_8 (default legacy DVB-S)
.TP
\fB\-M\fR, \fB\-\-network-name\fR <name>
DVB network name to declare in the NIT
.TP
\fB\-n\fR, \fB\-\-frontend\-number\fR <frontend number>
The frontend number
.TP
\fB\-N\fR, \fB\-\-network-id\fR <ID>
DVB network ID to declare in the NIT
.TP
\fB\-o\fR, \fB\-\-rtp-output\fR <SSRC IP>
RTP output IP
.TP
\fB\-O\fR, \fB\-\-lock-timeout\fR <timeout>
Timeout for the lock operation (in ms)
.TP
\fB\-p\fR, \fB\-\-force\-pulse\fR
Force 22kHz pulses for high-band selection (DVB-S)
.TP
\fB\-q\fR
\fB\-P\fR, \fB\-\-pilot\fR
DVB-S2 Pilot (-1 auto, 0 off, 1 on)
.TP
\fB\-q\fR, \fB\-\-quiet\fR
Be quiet (less verbosity, repeat or use number for even quieter)
.TP
\fB\-Q\fR, \fB\-\-quit-timeout\fR <delay>
When locked, quit after this delay (in ms), or after the first lock timeout
.TP
\fB\-r\fR, \fB\-\-remote\-socket\fR <remote socket>
Remote socket to use
.TP
......@@ -81,7 +151,7 @@ Rolloff value to use
.br
DVB-S2 35=0.35|25=0.25|20=0.20|0=AUTO (default: 35)
.TP
\fB\-s\fR, \fB\-\-symbole\-rate\fR <symbol rate>
\fB\-s\fR, \fB\-\-symbol\-rate\fR <symbol rate>
Symbole rate
.TP
\fB\-S\fR, \fB\-\-diseqc\fR <diseqc>
......@@ -105,11 +175,26 @@ Voltage to apply to the LNB (QPSK)
\fB\-V\fR, \fB\-\-version\fR
Only display the version
.TP
\fB\-W\fR, \fB\-\-slow\-cam\fR
Add extra delays for slow CAMs
\fB\-w\fR, \fB\-\-select-pmts\fR
set a PID filter on all PMTs
.TP
\fB\-x\fR, \fB\-\-print\fR
Print interesting events on stdout in a given format
.TP
\fB\-X\fR, \fB\-\-transmission\fR <transmission>
DVB-T transmission (2, 4, 8 or -1 auto, default
.TP
\fB\-z\fR, \fB\-\-any\-type\fR
pass through all ESs from the PMT, of any type
.TP
\fB\-Z\fR, \fB\-\-mrtg-file\fR <mrtg_file>
Every 10 seconds log statistics in <mrtg_file>. The file has 4 numbers in it
and the format is: <passed_bytes> <error_packets> <packets_with_seq_errors> <scrambled_packets>
.SH SEE ALSO
Read the README file for more information about the configuration of dvblast.
.SH AUTHORS
Writen by Marian Ďurkovič, Andy Gatward and Christophe Massiot
.SH LICENCE
This program is free software; you can redistribute it and/or modify it under the terms of version 2 of the GNU General Public License as published by the Free Software Foundation.
Writen by Marian Ďurkovič, Andy Gatward, Christophe Massiot and Jean-Paul Saman
.SH LICENSE
This program is free software; you can redistribute it and/or modify it under
the terms of version 2 of the GNU General Public License as published by the
Free Software Foundation.
This diff is collapsed.
This diff is collapsed.
......@@ -3,7 +3,6 @@
# dvblast_mmi.sh
###############################################################################
# Copyright (C) 1998-2008 VideoLAN
# $Id$
#
# Authors: Christophe Massiot <massiot@via.ecp.fr>
#
......
This diff is collapsed.
This diff is collapsed.
......@@ -2,23 +2,14 @@
* en50221.h
*****************************************************************************
* Copyright (C) 2008 VideoLAN
* $Id$
*
* Authors: Christophe Massiot <massiot@via.ecp.fr>
*
* 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
* This program is free software. It comes without any warranty, to
* the extent permitted by applicable law. You can redistribute it
* and/or modify it under the terms of the Do What The Fuck You Want
* To Public License, Version 2, as published by Sam Hocevar. See
* http://sam.zoy.org/wtfpl/COPYING for more details.
*****************************************************************************/
#include <malloc.h>
......@@ -69,7 +60,6 @@ typedef struct en50221_mmi_object_t
#define MAX_CI_SLOTS 16
#define MAX_SESSIONS 32
#define MAX_PROGRAMS 24
extern int i_ca_handle;
extern int i_ca_type;
......@@ -79,10 +69,11 @@ extern int i_ca_type;
*****************************************************************************/
void en50221_Init( void );
void en50221_Reset( void );
void en50221_Read( void );
void en50221_Poll( void );
void en50221_AddPMT( dvbpsi_pmt_t *p_pmt );
void en50221_UpdatePMT( dvbpsi_pmt_t *p_pmt );
void en50221_DeletePMT( dvbpsi_pmt_t *p_pmt );
void en50221_AddPMT( uint8_t *p_pmt );
void en50221_UpdatePMT( uint8_t *p_pmt );
void en50221_DeletePMT( uint8_t *p_pmt );
uint8_t en50221_StatusMMI( uint8_t *p_answer, ssize_t *pi_size );
uint8_t en50221_StatusMMISlot( uint8_t *p_buffer, ssize_t i_size,
uint8_t *p_answer, ssize_t *pi_size );
......
About DVBiscovery
=================
DVBiscovery is a shell script that tries to tune a number of frequencies
(from a config file), and stops after it has found a match. It then dumps
the output of DVBlast to the standard output, so that an external process
can parse it and find relevant information there. Typically, you would
want to get the network ID from the NIT, which unically identifies the
network you are on.
DVBiscovery is therefore a sort of scanning program, but doesn't aim at
exhaustivity (there are already programs doing that). It tries to guess
where you are without any external information.
#!/bin/sh
###############################################################################
# dvbiscovery.sh
###############################################################################
# Copyright (C) 2010 VideoLAN
#
# Authors: Christophe Massiot <massiot@via.ecp.fr>
#
# 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
###############################################################################
CONF_BASE="/usr/local/share/dvblast/dvbiscovery"
#CONF_BASE="./"
DVBLAST=dvblast
LOCK_TIMEOUT=2500
QUIT_TIMEOUT=20000
usage() {
echo "Usage: $0 [-a <adapter #>] [-n <frontend #>] [-S <diseqc sat num>] [-c <conf file>]" >&2
exit 1
}
conf_file_passed=""
adapter=""
frontend=""
diseqc=""
TEMP=`getopt -o a:n:S:c: -n "$0" -- "$@"`
if test $? -ne 0; then
usage
fi
eval set -- "$TEMP"
while :; do
case "$1" in
-a)
adapter="-a $2"
shift 2
;;
-n)
frontend="-n $2"
shift 2
;;
-c)
conf_file_passed=$2
shift 2
;;
-S)
diseqc="-S $2"
shift 2
;;
--)
shift
break
;;
*)
usage
;;
esac
done
type=`$DVBLAST $diseqc $adapter $frontend -f 0 2>&1 | grep '^debug: Frontend' | sed 's/^debug: Frontend ".*" type "\(.*\)" supports:$/\1/'`
tune=""
conf_file=""
case "$type" in
"QPSK (DVB-S/S2)")
conf_file="${CONF_BASE}_dvb-s.conf"
tune=tune_sat
;;
"QAM (DVB-C)")
conf_file="${CONF_BASE}_dvb-c.conf"
tune=tune_cable
;;
"OFDM (DVB-T)")
conf_file="${CONF_BASE}_dvb-t.conf"
tune=tune_dtt
;;
"ATSC")
conf_file="${CONF_BASE}_atsc.conf"
tune=tune_atsc
;;
*)
echo "unknown frontend type $type" >&2
exit 1
esac
if test -n "$conf_file_passed"; then
conf_file=$conf_file_passed
fi
if ! test -r "$conf_file"; then
echo "unable to open $conf_file" >&2
exit 1
fi
signal_catch() {
if test $childpid -ne 0; then
kill $childpid
wait $childpid
fi
exit 1
}
exec_dvblast() {
tmp_file=`mktemp`
$DVBLAST $diseqc $adapter $frontend -O $LOCK_TIMEOUT -Q $QUIT_TIMEOUT -q4 -x xml $opts >| $tmp_file &
childpid=$!
wait $childpid
if test $? -eq 0; then
cat $tmp_file
echo "</TS>"
rm $tmp_file
exit 0
fi
childpid=0
rm $tmp_file
}
strtofec() {
case "$1" in
"NONE") opts="$opts $2 0" ;;
"1/2") opts="$opts $2 12" ;;
"2/3") opts="$opts $2 23" ;;
"3/4") opts="$opts $2 34" ;;
"4/5") opts="$opts $2 45" ;;
"5/6") opts="$opts $2 56" ;;
"6/7") opts="$opts $2 67" ;;
"7/8") opts="$opts $2 78" ;;
"8/9") opts="$opts $2 89" ;;
"AUTO"|*) ;;
esac
}
strtomod() {
case "$1" in
"QPSK") opts="$opts -m qpsk" ;;
"QAM16") opts="$opts -m qam_16" ;;
"QAM32") opts="$opts -m qam_32" ;;
"QAM64") opts="$opts -m qam_64" ;;
"QAM128") opts="$opts -m qam_128" ;;
"8VSB") opts="$opts -m vsb_8" ;;
"16VSB") opts="$opts -m vsb_16" ;;
"AUTO"|*) ;;
esac
}
tune_sat() {
childpid=0
trap signal_catch 1 2 3 15
while read sys freq pol srate fec what mod; do
opts="-f $freq -s $srate"
case "$sys" in
"S") ;;
"S2")
case "$mod" in
"QPSK") opts="$opts -m qpsk" ;;
"8PSK") opts="$opts -m psk_8" ;;
*)
echo "invalid modulation $mod" >&2
;;
esac
;;
*)
echo "incompatible file" >&2
exit 1
;;
esac
strtofec $fec "-F"
case "$pol" in
"V") opts="$opts -v 13" ;;
"H") opts="$opts -v 18" ;;
*) ;;
esac
exec_dvblast
done
}
tune_cable() {
childpid=0
trap signal_catch 1 2 3 15
while read sys freq srate fec mod; do
opts="-f $freq -s $srate"
case "$sys" in
"C") ;;
*)
echo "incompatible file" >&2
exit 1
;;
esac
strtofec $fec "-F"
strtomod $mod
exec_dvblast
done
}
tune_dtt() {
childpid=0
trap signal_catch 1 2 3 15
while read sys freq bw fec fec2 mod mode guard hier; do
opts="-f $freq"
case "$sys" in
"T"|"T2") ;;
*)
echo "incompatible file" >&2
exit 1
;;
esac
case "$bw" in
"8MHz") opts="$opts -b 8" ;;
"7MHz") opts="$opts -b 7" ;;
"6MHz") opts="$opts -b 6" ;;
"AUTO"|*) ;;
esac
strtofec $fec "-F"
strtofec $fec2 "-K"
strtomod $mod
case "$mode" in
"2k") opts="$opts -X 2" ;;
"8k") opts="$opts -X 8" ;;
"AUTO"|*) ;;
esac
case "$guard" in
"1/32") opts="$opts -G 32" ;;
"1/16") opts="$opts -G 16" ;;
"1/8") opts="$opts -G 8" ;;
"1/4") opts="$opts -G 4" ;;
"AUTO"|*) ;;
esac
case "$hier" in
"NONE") opts="$opts -H 0" ;;
"1") opts="$opts -H 1" ;;
"2") opts="$opts -H 2" ;;
"4") opts="$opts -H 4" ;;
"AUTO"|*) ;;
esac
exec_dvblast
done
}
tune_atsc() {
childpid=0
trap signal_catch 1 2 3 15
while read sys freq mod; do
opts="-f $freq"
case "$sys" in
"A") ;;
*)
echo "incompatible file" >&2
exit 1
;;
esac
strtomod $mod
exec_dvblast
done
}
childpid=0
trap signal_catch 1 2 3 15
grep -v "^#" < "$conf_file" 2>/dev/null | $tune &
childpid=$!
wait $childpid
exit 100
# US ATSC center frequencies
A 57028615 8VSB
A 63028615 8VSB
A 69028615 8VSB
A 79028615 8VSB
A 85028615 8VSB
A 177028615 8VSB
A 183028615 8VSB
A 189028615 8VSB
A 195028615 8VSB
A 201028615 8VSB
A 207028615 8VSB
A 213028615 8VSB
A 473028615 8VSB
A 479028615 8VSB
A 485028615 8VSB
A 491028615 8VSB
A 497028615 8VSB
A 503028615 8VSB
A 509028615 8VSB
A 515028615 8VSB
A 521028615 8VSB
A 527028615 8VSB
A 533028615 8VSB
A 539028615 8VSB
A 545028615 8VSB
A 551028615 8VSB
A 557028615 8VSB
A 563028615 8VSB
A 569028615 8VSB
A 575028615 8VSB
A 581028615 8VSB
A 587028615 8VSB
A 593028615 8VSB
A 599028615 8VSB
A 605028615 8VSB
A 611028615 8VSB
A 617028615 8VSB
A 623028615 8VSB
A 629028615 8VSB
A 635028615 8VSB
A 641028615 8VSB
A 647028615 8VSB
A 653028615 8VSB
A 659028615 8VSB
A 665028615 8VSB
A 671028615 8VSB
A 677028615 8VSB
A 683028615 8VSB
A 689028615 8VSB
A 695028615 8VSB
A 701028615 8VSB
A 707028615 8VSB
A 713028615 8VSB
A 719028615 8VSB
A 725028615 8VSB
A 731028615 8VSB
A 737028615 8VSB
A 743028615 8VSB
A 749028615 8VSB
A 755028615 8VSB
A 761028615 8VSB
A 767028615 8VSB
A 773028615 8VSB
A 779028615 8VSB
A 785028615 8VSB
A 791028615 8VSB
A 797028615 8VSB
A 803028615 8VSB
# Gathered from diverse sources
C 113000000 6900000 NONE AUTO
C 121000000 6900000 NONE AUTO
C 123000000 6875000 NONE AUTO
C 146000000 6900000 NONE AUTO
C 154000000 6875000 NONE AUTO
C 154000000 6900000 NONE AUTO
C 163000000 6875000 NONE AUTO
C 218000000 6900000 NONE AUTO
C 241000000 6900000 NONE AUTO
C 283000000 5900000 NONE AUTO
C 289500000 6875000 NONE AUTO
C 306000000 6900000 NONE AUTO
C 313000000 6875000 NONE AUTO
C 314000000 6900000 NONE AUTO
C 330000000 6875000 NONE AUTO
C 346000000 6875000 NONE AUTO
C 354000000 6900000 NONE AUTO
C 354000000 6950000 NONE AUTO
C 372000000 6875000 NONE AUTO
C 377750000 6900000 NONE AUTO
C 386000000 6875000 NONE AUTO
C 386000000 6900000 NONE AUTO
C 394000000 6900000 NONE AUTO
C 410000000 6900000 NONE AUTO
C 418000000 6900000 NONE AUTO
C 434000000 6900000 NONE AUTO
C 442000000 6900000 NONE AUTO
C 450000000 6875000 NONE AUTO
C 490000000 6875000 NONE AUTO
C 514000000 6900000 NONE AUTO
C 530000000 6900000 NONE AUTO
C 634000000 6900000 NONE AUTO
C 714000000 6875000 NONE AUTO
# freq pol sr fec
# Astra 19.2E
S 12551500 V 22000000 5/6
# Eurobird 9E
S 11843000 V 27500000 AUTO
# Hotbird 13E
S 11727000 V 27500000 AUTO
# Astra 23.5E
S 11914000 H 27500000 AUTO
# Eurobird 28.5E
S 11623000 H 27500000 2/3
# Eutelsat 16.0E & Telecom2 8.0W & Amos 4.0W
S 10972000 V 27500000 AUTO
# Sirius 5.0E & Nilesat
S 11727000 H 27500000 AUTO
# Turksat 42.0E
S 10970000 V 30000000 5/6
# Atlantic Bird 1 12.5W
S 11408000 V 27500000 3/4
# Atlantic Bird 3 5.0W
S 11591000 V 20000000 2/3
# Hispasat 30.0W
S 12015000 V 27500000 3/4
# Telstar 12 15.0W
S 11060000 H 19279000 3/4
# Thor 1.0W
S 11216000 V 24500000 7/8
# Express AM1 40.0E
S 10967000 V 20000000 AUTO
# Hellas Sat 39.0E
S 12565000 V 30000000 AUTO
# Eutelsat W3A 7.0E
S 11283000 V 27500000 AUTO
This diff is collapsed.
--- linux/drivers/media/video/cx23885/cx23885-dvb.c.orig 2010-06-29 15:32:09.000000000 +0200
+++ linux/drivers/media/video/cx23885/cx23885-dvb.c 2010-06-29 15:32:16.000000000 +0200
@@ -83,7 +83,7 @@
struct cx23885_tsport *port = q->priv_data;
port->ts_packet_size = 188 * 4;
- port->ts_packet_count = 32;
+ port->ts_packet_count = 5;
*size = port->ts_packet_size * port->ts_packet_count;
*count = 32;
--- linux/drivers/media/dvb/ttpci/budget-core.c.orig 2010-06-09 08:54:16.000000000 +0200
+++ linux/drivers/media/dvb/ttpci/budget-core.c 2010-06-09 08:28:23.000000000 +0200
@@ -145,7 +145,7 @@
saa7146_write(dev, BASE_EVEN3, 0);
}
saa7146_write(dev, PROT_ADDR3, budget->buffer_size);
- saa7146_write(dev, BASE_PAGE3, budget->pt.dma | ME1 | 0x90);
+ saa7146_write(dev, BASE_PAGE3, budget->pt.dma | ME1 | 0x50);
saa7146_write(dev, PITCH3, budget->buffer_width);
saa7146_write(dev, NUM_LINE_BYTE3,
--- linux/drivers/media/video/cx88/cx88-dvb.c.orig 2010-02-22 14:58:43.000000000 +0100
+++ linux/drivers/media/video/cx88/cx88-dvb.c 2010-07-09 11:15:12.000000000 +0200
@@ -80,7 +80,7 @@
struct cx8802_dev *dev = q->priv_data;
dev->ts_packet_size = 188 * 4;
- dev->ts_packet_count = 32;
+ dev->ts_packet_count = 5;
*size = dev->ts_packet_size * dev->ts_packet_count;
*count = 32;
About DVBlast kernel patches
============================
These kernel patches are designed to dramatically improve the latency
between the DVB card and DVBlast's output, especially on low symbol rate
transponders, at the expense of a slightly higher CPU consumption.
Basically they decrease the size of the transmission buffers from the card
to 4 kB, so that TS packets are handled more frequently.
/*****************************************************************************
* mrtg-cnt.c Handle dvb TS packets and count them for MRTG
*****************************************************************************
* Copyright Tripleplay service 2004,2005,2011
*
* Author: Andy Lindsay <a.lindsay@tripleplay-services.com>
*
* 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/* vim: set shiftwidth=4 tabstop=4 expandtab autoindent : */
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include "dvblast.h"
// File handle
static FILE *mrtg_fh = NULL;
// Counts
static long long l_mrtg_packets = 0; // Packets received
static long long l_mrtg_seq_err_packets = 0; // Out of sequence packets received
static long long l_mrtg_error_packets = 0; // Packets received with the error flag set
static long long l_mrtg_scram_packets = 0; // Scrambled Packets received
// Reporting timer
#if defined( WIN32 )
static LARGE_INTEGER mrtg_time;
static LARGE_INTEGER mrtg_inc;
#else
static struct timeval mrtg_time = { 0, 0 };
#endif
// Define the dump period in seconds
#define MRTG_INTERVAL 10
// Pid sequence numbers
#define PIDS 0x2000
static signed char i_pid_seq[PIDS];
// Report the mrtg counters: bytes received, error packets & sequence errors
static void dumpCounts()
{
unsigned int multiplier = 1; //MRTG_INTERVAL;
if(mrtg_fh) {
rewind(mrtg_fh);
fprintf(mrtg_fh, "%lld %lld %lld %lld\n",
l_mrtg_packets * 188 * multiplier,
l_mrtg_error_packets * multiplier,
l_mrtg_seq_err_packets * multiplier,
l_mrtg_scram_packets * multiplier);
fflush(mrtg_fh);
}
}
// analyse the input block counting packets and errors
// The input is a pointer to a block_t structure, which might be a linked list
// of blocks. Each block has one TS packet.
void mrtgAnalyse(block_t * p_ts)
{
unsigned int i_pid;
block_t *p_block = p_ts;
if (mrtg_fh == NULL) return;
while (p_block != NULL) {
uint8_t *ts_packet = p_block->p_ts;
char i_seq, i_last_seq;
l_mrtg_packets++;
if (ts_packet[0] != 0x47) {
l_mrtg_error_packets++;
p_block = p_block->p_next;
continue;
}
if (ts_packet[1] & 0x80) {
l_mrtg_error_packets++;
p_block = p_block->p_next;
continue;
}
i_pid = (ts_packet[1] & 0x1f) << 8 | ts_packet[2];
// Just count null packets - don't check the sequence numbering
if (i_pid == 0x1fff) {
p_block = p_block->p_next;
continue;
}
if (ts_packet[3] & 0xc0) {
l_mrtg_scram_packets++;
}
// Check the sequence numbering
i_seq = ts_packet[3] & 0xf;
i_last_seq = i_pid_seq[i_pid];
if (i_last_seq == -1) {
// First packet - ignore the sequence
} else if (ts_packet[3] & 0x10) {
// Packet contains payload - sequence should be up by one
if (i_seq != ((i_last_seq + 1) & 0x0f)) {
l_mrtg_seq_err_packets++;
}
} else {
// Packet contains no payload - sequence should be unchanged
if (i_seq != i_last_seq) {
l_mrtg_seq_err_packets++;
}
}
i_pid_seq[i_pid] = i_seq;
// Look at next block
p_block = p_block->p_next;
}
// All blocks processed. See if we need to dump the stats
struct timeval now;
gettimeofday(&now, NULL);
if (timercmp(&now, &mrtg_time, >)) {
// Time to report the mrtg counters
dumpCounts();
// Set the timer for next time
//
// Normally we add the interval to the previous time so that if one
// dump is a bit late, the next one still occurs at the correct time.
// However, if there is a long gap (e.g. because the channel has
// stopped for some time), then just rebase the timing to the current
// time. I've chosen MRTG_INTERVAL as the long gap - this is arbitary
if ((now.tv_sec - mrtg_time.tv_sec) > MRTG_INTERVAL) {
msg_Dbg(NULL, "Dump is %d seconds late - reset timing\n",
(int) (now.tv_sec - mrtg_time.tv_sec));
mrtg_time = now;
}
mrtg_time.tv_sec += MRTG_INTERVAL;
}
}
int mrtgInit(char *mrtg_file)
{
if ( !mrtg_file )
return -1;
/* Open MRTG file */
msg_Dbg(NULL, "Opening mrtg file %s.\n", mrtg_file);
if ((mrtg_fh = fopen(mrtg_file, "wb")) == NULL) {
msg_Err(NULL, "unable to open mrtg file");
return -1;
}
// Initialise the file
fprintf(mrtg_fh, "0 0 0 0\n");
fflush(mrtg_fh);
// Initialise the sequence numbering
memset(&i_pid_seq[0], -1, sizeof(signed char) * PIDS);
// Set the reporting timer
gettimeofday(&mrtg_time, NULL);
mrtg_time.tv_sec += MRTG_INTERVAL;
return 0;
}
void mrtgClose()
{
// This is only for testing when using filetest.
if (mrtg_fh) {
dumpCounts();
fclose(mrtg_fh);
mrtg_fh = NULL;
}
}
/*****************************************************************************
* mrtg-cnt.h
*****************************************************************************
* Copyright Tripleplay service 2004,2005,2011
*
* Author: Andy Lindsay <a.lindsay@tripleplay-services.com>
*
* 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
/* vim: set shiftwidth=4 tabstop=4 expandtab autoindent : */
#ifndef MRTG_CNT_H
#define MRTG_CNT_H
int mrtgInit(char *mrtg_file);
void mrtgClose();
void mrtgAnalyse(block_t * p_ts);
#endif
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -2,7 +2,6 @@
* version.h
*****************************************************************************
* Copyright (C) 2004, 2008-2010 VideoLAN
* $Id$
*
* Authors: Andy Gatward <a.j.gatward@reading.ac.uk>
*
......@@ -21,7 +20,6 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#define VERSION_MAJOR 1
#define VERSION_MINOR 3
#define VERSION_MAJOR 2
#define VERSION_MINOR 0
#define VERSION_REVISION 0
#define VERSION_EXTRA "-svn"
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment