aboutsummaryrefslogtreecommitdiff
path: root/multimedia/vdr
diff options
context:
space:
mode:
authorJuergen Lock <nox@FreeBSD.org>2012-01-21 17:32:54 +0000
committerJuergen Lock <nox@FreeBSD.org>2012-01-21 17:32:54 +0000
commit556296fe6692c3141d20c3bf87b479397ff4f4b0 (patch)
treee754a0fa37fd22a3f6416696389380a63c4e0565 /multimedia/vdr
parent922347982c08123e9995cc740c3e42da50ba5e15 (diff)
downloadports-556296fe6692c3141d20c3bf87b479397ff4f4b0.tar.gz
ports-556296fe6692c3141d20c3bf87b479397ff4f4b0.zip
Notes
Diffstat (limited to 'multimedia/vdr')
-rw-r--r--multimedia/vdr/Makefile18
-rw-r--r--multimedia/vdr/distinfo4
-rw-r--r--multimedia/vdr/files/patch-PLUGINS-src-dvbsddevice-dvbsddevice.c10
-rw-r--r--multimedia/vdr/files/patch-diseqc.c11
-rw-r--r--multimedia/vdr/files/patch-initialchannel33
-rw-r--r--multimedia/vdr/files/patch-vdr-1.7.22_FreeBSD (renamed from multimedia/vdr/files/patch-vdr-1.7.18_FreeBSD)75
-rw-r--r--multimedia/vdr/files/patch-z-Makefile14
-rw-r--r--multimedia/vdr/files/patch-z-config.c10
-rw-r--r--multimedia/vdr/files/vdr-1.7.15-ttxtsubs.patch-2179
-rw-r--r--multimedia/vdr/files/vdr-1.7.18-1.7.19-tspacketbug.diff356
-rw-r--r--multimedia/vdr/files/vdr-1.7.19-ttxtsubs.patch-321
-rw-r--r--multimedia/vdr/files/vdr-1.7.21-ttxtsubs.patch-1 (renamed from multimedia/vdr/files/vdr-1.7.15-ttxtsubs.patch-1)291
-rw-r--r--multimedia/vdr/files/vdr-1.7.21-ttxtsubs.patch-256
-rw-r--r--multimedia/vdr/files/vdr-waitdvb.in40
-rw-r--r--multimedia/vdr/files/vdr.in18
-rw-r--r--multimedia/vdr/pkg-plist25
16 files changed, 378 insertions, 783 deletions
diff --git a/multimedia/vdr/Makefile b/multimedia/vdr/Makefile
index 997e06ebb2f7..9777b80dbcdc 100644
--- a/multimedia/vdr/Makefile
+++ b/multimedia/vdr/Makefile
@@ -6,8 +6,7 @@
#
PORTNAME= vdr
-PORTVERSION= 1.7.19
-PORTREVISION= 3
+PORTVERSION= 1.7.22
CATEGORIES= multimedia
MASTER_SITES= ftp://ftp.tvdr.de/vdr/Developer/
@@ -27,7 +26,7 @@ USE_BZIP2= yes
USE_GMAKE= yes
USE_GNOME+= pkgconfig
USE_GETTEXT= yes
-PORTDOCS= COPYING INSTALL MANUAL README
+PORTDOCS= COPYING INSTALL MANUAL README HISTORY
MAKE_JOBS_SAFE= yes
MAN1= vdr.1
MAN5= vdr.5
@@ -45,6 +44,7 @@ ALL_TARGET= all plugins
VIDEODIR= /video
SUB_LIST+= VIDEODIR=${VIDEODIR}
+SUB_FILES+= vdr-waitdvb
USE_RC_SUBR= vdr
VDR_USER= vdr
VDR_GROUP= vdr
@@ -74,24 +74,21 @@ ALL_TARGET= vdr plugins
.endif
post-patch:
-# avoid a bug found post-release by reverting parts of the 1.7.19 update
-# thread:
-# http://thread.gmane.org/gmane.linux.vdr/44724/focus=44729
- @${PATCH} -d ${WRKSRC} --quiet -p1 -R <${FILESDIR}/vdr-1.7.18-1.7.19-tspacketbug.diff
# clang doesn't know -MG:
@${REINPLACE_CMD} '/^MAKEDEP.*-MM/s/-MG[[:space:]]*$$/# -MG/' \
${WRKSRC}/Makefile ${WRKSRC}/libsi/Makefile \
${WRKSRC}/PLUGINS/src/*/Makefile
.if defined(WITH_TTXPATCH)
- @${PATCH} -d ${WRKSRC} --quiet -p1 <${FILESDIR}/vdr-1.7.15-ttxtsubs.patch-1
- @${PATCH} -d ${WRKSRC} --quiet -p1 <${FILESDIR}/vdr-1.7.15-ttxtsubs.patch-2
- @${PATCH} -d ${WRKSRC} --quiet -p1 <${FILESDIR}/vdr-1.7.19-ttxtsubs.patch-3
+ @${PATCH} -d ${WRKSRC} --quiet -p1 <${FILESDIR}/vdr-1.7.21-ttxtsubs.patch-1
+ @${PATCH} -d ${WRKSRC} --quiet -p1 <${FILESDIR}/vdr-1.7.21-ttxtsubs.patch-2
.endif
@${SED} 's|^\(VIDEODIR[[:space:]]*\)[?]*\(=[[:space:]]*\).*|\1\2${VIDEODIR}|' \
${WRKSRC}/Make.config.template >${WRKSRC}/Make.config
@${REINPLACE_CMD} -e 's|%%CONFDIR%%|${CONFDIR}|' ${WRKSRC}/vdr.1
# We don't support this yet:
@${RM} -r ${WRKSRC}/PLUGINS/src/dvbhddevice
+# upstream bug:
+ @${CP} ${WRKSRC}/svdrpsend.pl ${WRKSRC}/svdrpsend
post-install:
.if !defined(WITHOUT_NLS)
@@ -109,6 +106,7 @@ post-install:
${INSTALL_DATA} -o ${VDR_USER} -g ${VDR_GROUP} ${WRKSRC}/$$i ${CONFDIR}/$$i; \
fi; \
done
+ ${INSTALL_SCRIPT} ${WRKDIR}/vdr-waitdvb ${PREFIX}/bin
.if !defined(NOPORTDOCS)
${MKDIR} ${DOCSDIR}
(cd ${WRKSRC} && ${INSTALL_DATA} ${PORTDOCS} ${DOCSDIR})
diff --git a/multimedia/vdr/distinfo b/multimedia/vdr/distinfo
index 0033b061d918..da4eaa4d8932 100644
--- a/multimedia/vdr/distinfo
+++ b/multimedia/vdr/distinfo
@@ -1,2 +1,2 @@
-SHA256 (vdr/vdr-1.7.19.tar.bz2) = 25481ac1fdc01fbed4e8bde6436346bb919c966aff4da0d67b5cc13318e6039e
-SIZE (vdr/vdr-1.7.19.tar.bz2) = 717625
+SHA256 (vdr/vdr-1.7.22.tar.bz2) = 73c36058400bc86b8b5aaaf5de0989551e4e6fc052157bebd180bfac4af7f628
+SIZE (vdr/vdr-1.7.22.tar.bz2) = 757800
diff --git a/multimedia/vdr/files/patch-PLUGINS-src-dvbsddevice-dvbsddevice.c b/multimedia/vdr/files/patch-PLUGINS-src-dvbsddevice-dvbsddevice.c
deleted file mode 100644
index ec9c2dddaf1a..000000000000
--- a/multimedia/vdr/files/patch-PLUGINS-src-dvbsddevice-dvbsddevice.c
+++ /dev/null
@@ -1,10 +0,0 @@
---- PLUGINS/src/dvbsddevice/dvbsddevice.c.orig
-+++ PLUGINS/src/dvbsddevice/dvbsddevice.c
-@@ -6,6 +6,7 @@
- * $Id: dvbsddevice.c 1.3 2010/01/30 10:05:42 kls Exp $
- */
-
-+#include <stdint.h>
- #include <vdr/plugin.h>
- #include "dvbsdffdevice.h"
-
diff --git a/multimedia/vdr/files/patch-diseqc.c b/multimedia/vdr/files/patch-diseqc.c
deleted file mode 100644
index c4811781d87d..000000000000
--- a/multimedia/vdr/files/patch-diseqc.c
+++ /dev/null
@@ -1,11 +0,0 @@
---- diseqc.c.orig
-+++ diseqc.c
-@@ -108,7 +108,7 @@ const char *cDiseqc::Codes(const char *s
- errno = 0;
- int n = strtol(t, &p, 16);
- if (!errno && p != t && 0 <= n && n <= 255) {
-- if (parsing) {
-+ if (!parsing) {
- codes[NumCodes++] = uchar(n);
- numCodes = NumCodes;
- }
diff --git a/multimedia/vdr/files/patch-initialchannel b/multimedia/vdr/files/patch-initialchannel
deleted file mode 100644
index cb658665a03d..000000000000
--- a/multimedia/vdr/files/patch-initialchannel
+++ /dev/null
@@ -1,33 +0,0 @@
---- config.c.orig
-+++ config.c
-@@ -399,7 +399,7 @@ cSetup::cSetup(void)
- CurrentChannel = -1;
- CurrentVolume = MAXVOLUME;
- CurrentDolby = 0;
-- // InitialChannel is initialized by constructor
-+ InitialChannel = "";
- InitialVolume = -1;
- ChannelsWrap = 0;
- EmergencyExit = 1;
---- vdr.c.orig
-+++ vdr.c
-@@ -735,12 +723,14 @@ int main(int argc, char *argv[])
-
- if (!cDevice::WaitForAllDevicesReady(DEVICEREADYTIMEOUT))
- dsyslog("not all devices ready after %d seconds", DEVICEREADYTIMEOUT);
-- if (isnumber(Setup.InitialChannel)) { // for compatibility with old setup.conf files
-- if (cChannel *Channel = Channels.GetByNumber(atoi(Setup.InitialChannel)))
-- Setup.InitialChannel = Channel->GetChannelID().ToString();
-+ if (*Setup.InitialChannel) {
-+ if (isnumber(Setup.InitialChannel)) { // for compatibility with old setup.conf files
-+ if (cChannel *Channel = Channels.GetByNumber(atoi(Setup.InitialChannel)))
-+ Setup.InitialChannel = Channel->GetChannelID().ToString();
-+ }
-+ if (cChannel *Channel = Channels.GetByChannelID(tChannelID::FromString(Setup.InitialChannel)))
-+ Setup.CurrentChannel = Channel->Number();
- }
-- if (cChannel *Channel = Channels.GetByChannelID(tChannelID::FromString(Setup.InitialChannel)))
-- Setup.CurrentChannel = Channel->Number();
- if (Setup.InitialVolume >= 0)
- Setup.CurrentVolume = Setup.InitialVolume;
- Channels.SwitchTo(Setup.CurrentChannel);
diff --git a/multimedia/vdr/files/patch-vdr-1.7.18_FreeBSD b/multimedia/vdr/files/patch-vdr-1.7.22_FreeBSD
index 642b49b4179b..c65207d1bc63 100644
--- a/multimedia/vdr/files/patch-vdr-1.7.18_FreeBSD
+++ b/multimedia/vdr/files/patch-vdr-1.7.22_FreeBSD
@@ -1,14 +1,7 @@
Index: Make.config.template
-===================================================================
-RCS file: /progs/network/ccvs/vdr/Make.config.template,v
-retrieving revision 1.1.1.3
-retrieving revision 1.5
-diff -u -r1.1.1.3 -r1.5
---- Make.config.template 2010/03/01 09:42:48 1.1.1.3
-+++ Make.config.template 2010/03/01 09:58:06 1.5
@@ -8,6 +8,11 @@
#
- # $Id: Make.config.template 2.2 2010/02/06 14:50:03 kls Exp $
+ # $Id: Make.config.template 2.4 2011/12/04 14:41:00 kls Exp $
+OSTYPE ?= $(shell uname -s)
+ifeq ($(OSTYPE),FreeBSD)
@@ -18,7 +11,7 @@ diff -u -r1.1.1.3 -r1.5
### The C compiler and options:
CC = gcc
-@@ -23,20 +28,35 @@
+@@ -23,20 +28,34 @@ endif
### The directory environment:
@@ -42,15 +35,14 @@ diff -u -r1.1.1.3 -r1.5
+CONFDIR = $(PREFIX)/etc/vdr
+PLUGINLIBDIR= $(PREFIX)/lib/vdr
+else
-+#DVBDIR = /usr/src/v4l-dvb/linux
+LOCDIR = ./locale
- CONFDIR = $(VIDEODIR)
+PLUGINLIBDIR= $(PLUGINDIR)/lib
+ CONFDIR = $(VIDEODIR)
+endif
### The remote control:
- LIRC_DEVICE = /dev/lircd
+ LIRC_DEVICE = /var/run/lirc/lircd
+ifdef FREEBSD
+RCU_DEVICE = /dev/cuau0
+else
@@ -59,15 +51,14 @@ diff -u -r1.1.1.3 -r1.5
## Define if you want vdr to not run as root
#VDR_USER = vdr
-@@ -45,4 +65,8 @@
-
+@@ -46,3 +65,7 @@ RCU_DEVICE = /dev/ttyS1
ifdef DVBDIR
INCLUDES += -I$(DVBDIR)/include
-+endif
+ endif
+
+ifdef FREEBSD
+INCLUDES += -I/usr/local/include
- endif
++endif
Index: Makefile
@@ -8,6 +8,11 @@
@@ -93,7 +84,7 @@ Index: Makefile
INCLUDES ?= $(shell pkg-config --cflags freetype2 fontconfig)
PLUGINDIR= ./PLUGINS
-@@ -130,7 +139,11 @@ i18n: $(I18Nmsgs)
+@@ -151,7 +160,11 @@ i18n: $(I18Nmsgs)
install-i18n:
@mkdir -p $(DESTDIR)$(LOCDIR)
@@ -105,19 +96,19 @@ Index: Makefile
# The 'include' directory (for plugins):
-@@ -169,7 +182,11 @@ install: install-bin install-conf instal
+@@ -190,7 +203,11 @@ install: install-bin install-conf instal
install-bin: vdr
@mkdir -p $(DESTDIR)$(BINDIR)
+ifdef FREEBSD
-+ @cp -f vdr svdrpsend.pl $(DESTDIR)$(BINDIR)
++ @cp -f vdr svdrpsend $(DESTDIR)$(BINDIR)
+else
- @cp --remove-destination vdr svdrpsend.pl $(DESTDIR)$(BINDIR)
+ @cp --remove-destination vdr svdrpsend $(DESTDIR)$(BINDIR)
+endif
# Configuration files:
-@@ -192,13 +209,18 @@ install-doc:
+@@ -213,13 +230,18 @@ install-doc:
install-plugins: plugins
@mkdir -p $(DESTDIR)$(PLUGINLIBDIR)
@@ -134,17 +125,10 @@ Index: Makefile
@cp -pLR include/vdr include/libsi $(DESTDIR)$(INCDIR)
+ @cp Make.config Make.global $(DESTDIR)$(INCDIR)/vdr
- # Source documentation:
+ # pkg-config file:
Index: channels.c
-===================================================================
-RCS file: /progs/network/ccvs/vdr/channels.c,v
-retrieving revision 1.1.1.5
-retrieving revision 1.6
-diff -u -r1.1.1.5 -r1.6
---- channels.c 2010/06/07 09:07:28 1.1.1.5
-+++ channels.c 2010/06/07 09:12:57 1.6
-@@ -29,7 +29,12 @@
+@@ -29,7 +29,12 @@ tChannelID tChannelID::FromString(const
int tid;
int sid;
int rid = 0;
@@ -157,9 +141,9 @@ diff -u -r1.1.1.5 -r1.6
if (fields == 4 || fields == 5) {
int source = cSource::FromString(sourcebuf);
free(sourcebuf);
-@@ -543,7 +548,17 @@
- char *vpidbuf = NULL;
+@@ -554,7 +559,18 @@ bool cChannel::Parse(const char *s)
char *apidbuf = NULL;
+ char *tpidbuf = NULL;
char *caidbuf = NULL;
+#ifdef __FreeBSD__
+ namebuf = MALLOC(char, 256);
@@ -167,10 +151,11 @@ diff -u -r1.1.1.5 -r1.6
+ parambuf = MALLOC(char, 256);
+ vpidbuf = MALLOC(char, 256);
+ apidbuf = MALLOC(char, 256);
++ tpidbuf = MALLOC(char, 256);
+ caidbuf = MALLOC(char, 256);
-+ int fields = sscanf(s, "%255[^:]:%d :%255[^:]:%9[^:] :%d :%255[^:]:%255[^:]:%d :%255[^:]:%d :%d :%d :%d ", namebuf, &frequency, parambuf, sourcebuf, &srate, vpidbuf, apidbuf, &tpid, caidbuf, &sid, &nid, &tid, &rid);
++ int fields = sscanf(s, "%255[^:]:%d :%255[^:]:%255[^:] :%d :%255[^:]:%255[^:]:%255[^:]:%255[^:]:%d :%d :%d :%d ", namebuf, &frequency, parambuf, sourcebuf, &srate, vpidbuf, apidbuf, tpidbuf, caidbuf, &sid, &nid, &tid, &rid);
+#else
- int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%d :%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, &parambuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpid, &caidbuf, &sid, &nid, &tid, &rid);
+ int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%a[^:]:%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, &parambuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpidbuf, &caidbuf, &sid, &nid, &tid, &rid);
+#endif
if (fields >= 9) {
if (fields == 9) {
@@ -214,21 +199,14 @@ diff -u -r1.1.1.4 -r1.4
#include "i18n.h"
#include "interface.h"
Index: diseqc.c
-===================================================================
-RCS file: /progs/network/ccvs/vdr/diseqc.c,v
-retrieving revision 1.1.1.3
-retrieving revision 1.4
-diff -u -r1.1.1.3 -r1.4
---- diseqc.c 2010/03/01 09:42:49 1.1.1.3
-+++ diseqc.c 2010/03/01 09:58:06 1.4
-@@ -50,7 +50,14 @@
- }
+@@ -114,7 +114,14 @@ bool cDiseqc::Parse(const char *s)
return true;
- }
+ bool result = false;
+ char *sourcebuf = NULL;
+#ifdef __FreeBSD__
+ sourcebuf = MALLOC(char, 10);
+ if (commands == NULL)
-+ commands = MALLOC(char, 256);
++ commands = MALLOC(char, 256);
+ int fields = sscanf(s, "%9[^ ] %d %c %d %255[^\n]", sourcebuf, &slof, &polarization, &lof, commands);
+#else
int fields = sscanf(s, "%a[^ ] %d %c %d %a[^\n]", &sourcebuf, &slof, &polarization, &lof, &commands);
@@ -940,7 +918,7 @@ Index: vdr.c
static void SignalHandler(int signum)
{
-@@ -388,14 +397,18 @@ int main(int argc, char *argv[])
+@@ -400,14 +409,18 @@ int main(int argc, char *argv[])
if (VdrUser && geteuid() == 0) {
StartedAsRoot = true;
if (strcmp(VdrUser, "root")) {
@@ -959,7 +937,7 @@ Index: vdr.c
}
}
-@@ -539,6 +552,24 @@ int main(int argc, char *argv[])
+@@ -556,6 +569,25 @@ int main(int argc, char *argv[])
CodeSet++; // skip the dot
}
}
@@ -976,7 +954,8 @@ Index: vdr.c
+ const char *Lang = login_getcapstr(Lc, "lang", NULL, NULL);
+ if (Lang && setlocale(LC_CTYPE, Lang)) {
+ CodeSet = nl_langinfo(CODESET);
-+ }
++ setenv("LANG", Lang, 1);
++ }
+ login_close(Lc);
+ }
+ }
diff --git a/multimedia/vdr/files/patch-z-Makefile b/multimedia/vdr/files/patch-z-Makefile
index 1208079418d9..2a066f5f6a87 100644
--- a/multimedia/vdr/files/patch-z-Makefile
+++ b/multimedia/vdr/files/patch-z-Makefile
@@ -6,9 +6,9 @@ Index: Makefile
- $(MAKE) -C $(LSIDIR) all
+ $(MAKE) -C $(LSIDIR) all CC=${CC} CXX=${CXX}
- # Internationalization (I18N):
+ # pkg-config file:
-@@ -167,7 +167,7 @@ plugins: include-dir
+@@ -186,7 +186,7 @@ plugins: include-dir
noapiv="$$noapiv $$i";\
continue;\
fi;\
@@ -17,16 +17,16 @@ Index: Makefile
done;\
if [ -n "$$noapiv" ] ; then echo; echo "*** plugins without APIVERSION:$$noapiv"; echo; fi;\
if [ -n "$$failed" ] ; then echo; echo "*** failed plugins:$$failed"; echo; exit 1; fi
-@@ -176,7 +176,7 @@ clean-plugins:
+@@ -197,7 +197,7 @@ clean-plugins:
# Install the files:
--install: install-bin install-conf install-doc install-plugins install-i18n install-includes
-+install: install-bin install-doc install-plugins install-includes
+-install: install-bin install-conf install-doc install-plugins install-i18n install-includes install-pc
++install: install-bin install-conf install-doc install-plugins install-includes install-pc
# VDR binary:
-@@ -191,7 +191,6 @@ endif
+@@ -212,7 +212,6 @@ endif
# Configuration files:
install-conf:
@@ -34,7 +34,7 @@ Index: Makefile
@if [ ! -d $(DESTDIR)$(CONFDIR) ]; then\
mkdir -p $(DESTDIR)$(CONFDIR);\
cp *.conf $(DESTDIR)$(CONFDIR);\
-@@ -207,7 +206,7 @@ install-doc:
+@@ -228,7 +227,7 @@ install-doc:
# Plugins:
diff --git a/multimedia/vdr/files/patch-z-config.c b/multimedia/vdr/files/patch-z-config.c
new file mode 100644
index 000000000000..6ffc4a252f6e
--- /dev/null
+++ b/multimedia/vdr/files/patch-z-config.c
@@ -0,0 +1,10 @@
+--- config.c.orig
++++ config.c
+@@ -72,7 +72,6 @@ cSatCableNumbers::cSatCableNumbers(int S
+ {
+ size = Size;
+ array = MALLOC(int, size);
+- memset(array, size * sizeof(int), 0);
+ FromString(s);
+ }
+
diff --git a/multimedia/vdr/files/vdr-1.7.15-ttxtsubs.patch-2 b/multimedia/vdr/files/vdr-1.7.15-ttxtsubs.patch-2
deleted file mode 100644
index da202831c3f3..000000000000
--- a/multimedia/vdr/files/vdr-1.7.15-ttxtsubs.patch-2
+++ /dev/null
@@ -1,179 +0,0 @@
---- a/channels.c
-+++ b/channels.c
-@@ -383,6 +383,26 @@ void cChannel::SetSubtitlingDescriptors(
- }
- }
-
-+void cChannel::SetTeletextSubtitlePages(tTeletextSubtitlePage pages[], int numberOfPages)
-+{
-+ int mod = CHANNELMOD_NONE;
-+ if (totalTtxtSubtitlePages != (fixedTtxtSubtitlePages + numberOfPages))
-+ mod |= CHANNELMOD_PIDS;
-+ totalTtxtSubtitlePages = fixedTtxtSubtitlePages;
-+ for (int i = 0; (i < numberOfPages) && (totalTtxtSubtitlePages < MAXTXTPAGES); i++) {
-+ if (teletextSubtitlePages[totalTtxtSubtitlePages].ttxtMagazine != pages[i].ttxtMagazine ||
-+ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtPage != pages[i].ttxtPage ||
-+ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtType != pages[i].ttxtType ||
-+ strcmp(teletextSubtitlePages[totalTtxtSubtitlePages].ttxtLanguage, pages[i].ttxtLanguage)) {
-+ mod |= CHANNELMOD_PIDS;
-+ teletextSubtitlePages[totalTtxtSubtitlePages] = pages[i];
-+ }
-+ totalTtxtSubtitlePages++;
-+ }
-+ modification |= mod;
-+ Channels.SetModified();
-+}
-+
- void cChannel::SetCaIds(const int *CaIds)
- {
- if (caids[0] && caids[0] <= CA_USER_MAX)
-@@ -511,11 +531,24 @@ cString cChannel::ToText(const cChannel
- q += IntArrayToString(q, Channel->dpids, 10, Channel->dlangs, Channel->dtypes);
- }
- *q = 0;
-+ const int TBufferSize = 5 + 1 + (MAXTXTPAGES * (3 + 1 + MAXLANGCODE1 + 1)) + 10; // '12345;150=deu,151=fin,...', +10: paranoia
-+ char tpidbuf[TBufferSize];
-+ q = tpidbuf;
-+ q += snprintf(q, sizeof(tpidbuf), "%d", Channel->tpid);
-+ if (Channel->fixedTtxtSubtitlePages > 0) {
-+ q += snprintf(q, sizeof(tpidbuf) - (q - tpidbuf), ";");
-+ for (int i = 0; i < Channel->fixedTtxtSubtitlePages; ++i) {
-+ tTeletextSubtitlePage page = Channel->teletextSubtitlePages[i];
-+ q += snprintf(q, sizeof(tpidbuf) - (q - tpidbuf),
-+ i + 1 < Channel->fixedTtxtSubtitlePages ? "%d=%s," : "%d=%s",
-+ page.PageNumber(), page.ttxtLanguage);
-+ }
-+ }
- char caidbuf[MAXCAIDS * 5 + 10]; // 5: 4 digits plus delimiting ',', 10: paranoia
- q = caidbuf;
- q += IntArrayToString(q, Channel->caids, 16);
- *q = 0;
-- buffer = cString::sprintf("%s:%d:%s:%s:%d:%s:%s:%d:%s:%d:%d:%d:%d\n", FullName, Channel->frequency, *Channel->parameters, *cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, Channel->tpid, caidbuf, Channel->sid, Channel->nid, Channel->tid, Channel->rid);
-+ buffer = cString::sprintf("%s:%d:%s:%s:%d:%s:%s:%s:%s:%d:%d:%d:%d\n", FullName, Channel->frequency, *Channel->parameters, *cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, tpidbuf, caidbuf, Channel->sid, Channel->nid, Channel->tid, Channel->rid);
- }
- return buffer;
- }
-@@ -549,6 +582,7 @@ bool cChannel::Parse(const char *s)
- char *parambuf = NULL;
- char *vpidbuf = NULL;
- char *apidbuf = NULL;
-+ char *tpidbuf = NULL;
- char *caidbuf = NULL;
- #ifdef __FreeBSD__
- namebuf = MALLOC(char, 256);
-@@ -556,10 +590,11 @@ bool cChannel::Parse(const char *s)
- parambuf = MALLOC(char, 256);
- vpidbuf = MALLOC(char, 256);
- apidbuf = MALLOC(char, 256);
-+ tpidbuf = MALLOC(char, 256);
- caidbuf = MALLOC(char, 256);
-- int fields = sscanf(s, "%255[^:]:%d :%255[^:]:%9[^:] :%d :%255[^:]:%255[^:]:%d :%255[^:]:%d :%d :%d :%d ", namebuf, &frequency, parambuf, sourcebuf, &srate, vpidbuf, apidbuf, &tpid, caidbuf, &sid, &nid, &tid, &rid);
-+ int fields = sscanf(s, "%255[^:]:%d :%255[^:]:%9[^:] :%d :%255[^:]:%255[^:]:%255[^:]:%255[^:]:%d :%d :%d :%d ", namebuf, &frequency, parambuf, sourcebuf, &srate, vpidbuf, apidbuf, tpidbuf, caidbuf, &sid, &nid, &tid, &rid);
- #else
-- int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%d :%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, &parambuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpid, &caidbuf, &sid, &nid, &tid, &rid);
-+ int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%a[^:]:%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, &parambuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpidbuf, &caidbuf, &sid, &nid, &tid, &rid);
- #endif
- if (fields >= 9) {
- if (fields == 9) {
-@@ -659,7 +694,37 @@ bool cChannel::Parse(const char *s)
- dpids[NumDpids] = 0;
- dtypes[NumDpids] = 0;
- }
--
-+ if (tpidbuf) {
-+ char *p;
-+ fixedTtxtSubtitlePages = 0;
-+ // 2001;150=deu,151=fin
-+ if ((p = strchr(tpidbuf, ';')) != NULL) {
-+ char *q, *strtok_next;
-+ *p++ = 0;
-+ while ((q = strtok_r(p, ",", &strtok_next)) != NULL) {
-+ if (fixedTtxtSubtitlePages < MAXTXTPAGES) {
-+ int page;
-+ char *l = strchr(q, '=');
-+ if (l)
-+ *l++ = 0;
-+ if (sscanf(q, "%d", &page) == 1) {
-+ teletextSubtitlePages[fixedTtxtSubtitlePages] = tTeletextSubtitlePage(page);
-+ if (l)
-+ strn0cpy(teletextSubtitlePages[fixedTtxtSubtitlePages].ttxtLanguage, l, MAXLANGCODE1);
-+ fixedTtxtSubtitlePages++;
-+ }
-+ else
-+ esyslog("ERROR: invalid Teletext page!"); // no need to set ok to 'false'
-+ }
-+ else
-+ esyslog("ERROR: too many Teletext pages!"); // no need to set ok to 'false'
-+ p = NULL;
-+ }
-+ totalTtxtSubtitlePages = fixedTtxtSubtitlePages;
-+ }
-+ if (sscanf(tpidbuf, "%d", &tpid) != 1)
-+ return false;
-+ }
- if (caidbuf) {
- char *p = caidbuf;
- char *q;
-@@ -696,6 +761,7 @@ bool cChannel::Parse(const char *s)
- free(sourcebuf);
- free(vpidbuf);
- free(apidbuf);
-+ free(tpidbuf);
- free(caidbuf);
- free(namebuf);
- if (!GetChannelID().Valid()) {
---- a/pat.c
-+++ b/pat.c
-@@ -17,6 +17,7 @@
- #include "libsi/section.h"
- #include "libsi/descriptor.h"
- #include "thread.h"
-+#include "vdrttxtsubshooks.h"
-
- #define PMT_SCAN_TIMEOUT 10 // seconds
-
-@@ -347,6 +348,8 @@ void cPatFilter::Process(u_short Pid, u_
- char DLangs[MAXDPIDS][MAXLANGCODE2] = { "" };
- char SLangs[MAXSPIDS][MAXLANGCODE2] = { "" };
- int Tpid = 0;
-+ tTeletextSubtitlePage TeletextSubtitlePages[MAXTXTPAGES];
-+ int NumTPages = 0;
- int NumApids = 0;
- int NumDpids = 0;
- int NumSpids = 0;
-@@ -438,8 +441,21 @@ void cPatFilter::Process(u_short Pid, u_
- NumSpids++;
- }
- break;
-- case SI::TeletextDescriptorTag:
-+ case SI::TeletextDescriptorTag: {
- Tpid = esPid;
-+ SI::TeletextDescriptor *sd = (SI::TeletextDescriptor *)d;
-+ SI::TeletextDescriptor::Teletext ttxt;
-+ for (SI::Loop::Iterator it; sd->teletextLoop.getNext(ttxt, it); ) {
-+ bool isSubtitlePage = (ttxt.getTeletextType() == 0x02) || (ttxt.getTeletextType() == 0x05);
-+ if ((NumTPages < MAXTXTPAGES) && ttxt.languageCode[0] && isSubtitlePage) {
-+ strn0cpy(TeletextSubtitlePages[NumTPages].ttxtLanguage, I18nNormalizeLanguageCode(ttxt.languageCode), MAXLANGCODE1);
-+ TeletextSubtitlePages[NumTPages].ttxtPage = ttxt.getTeletextPageNumber();
-+ TeletextSubtitlePages[NumTPages].ttxtMagazine = ttxt.getTeletextMagazineNumber();
-+ TeletextSubtitlePages[NumTPages].ttxtType = ttxt.getTeletextType();
-+ NumTPages++;
-+ }
-+ }
-+ }
- break;
- case SI::ISO639LanguageDescriptorTag: {
- SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d;
-@@ -541,6 +557,12 @@ void cPatFilter::Process(u_short Pid, u_
- }
- if (Setup.UpdateChannels >= 2) {
- Channel->SetPids(Vpid, Ppid, Vtype, Apids, Atypes, ALangs, Dpids, Dtypes, DLangs, Spids, SLangs, Tpid);
-+ if (NumTPages < MAXTXTPAGES) {
-+ int manualPageNumber = cVDRTtxtsubsHookListener::Hook()->ManualPageNumber(Channel);
-+ if (manualPageNumber)
-+ TeletextSubtitlePages[NumTPages++] = tTeletextSubtitlePage(manualPageNumber);
-+ }
-+ Channel->SetTeletextSubtitlePages(TeletextSubtitlePages, NumTPages);
- if (!cSource::IsType(Channel->Source(), 'I'))
- Channel->SetCaIds(CaDescriptors->CaIds());
- Channel->SetSubtitlingDescriptors(SubtitlingTypes, CompositionPageIds, AncillaryPageIds);
diff --git a/multimedia/vdr/files/vdr-1.7.18-1.7.19-tspacketbug.diff b/multimedia/vdr/files/vdr-1.7.18-1.7.19-tspacketbug.diff
deleted file mode 100644
index a58f4d879995..000000000000
--- a/multimedia/vdr/files/vdr-1.7.18-1.7.19-tspacketbug.diff
+++ /dev/null
@@ -1,356 +0,0 @@
-diff -ruN vdr-1.7.18/recorder.c vdr-1.7.19/recorder.c
---- vdr-1.7.18/recorder.c 2010-12-27 12:35:46.000000000 +0100
-+++ vdr-1.7.19/recorder.c 2011-06-12 16:16:45.000000000 +0200
-@@ -4,7 +4,7 @@
- * See the main source file 'vdr.c' for copyright information and
- * how to reach the author.
- *
-- * $Id: recorder.c 2.9 2010/12/27 11:35:46 kls Exp $
-+ * $Id: recorder.c 2.11 2011/06/12 14:16:45 kls Exp $
- */
-
- #include "recorder.h"
-@@ -31,7 +31,7 @@
-
- SpinUpDisk(FileName);
-
-- ringBuffer = new cRingBufferLinear(RECORDERBUFSIZE, MIN_TS_PACKETS_FOR_FRAME_DETECTOR * TS_SIZE, true, "Recorder");
-+ ringBuffer = new cRingBufferLinear(RECORDERBUFSIZE, TS_SIZE, true, "Recorder");
- ringBuffer->SetTimeouts(0, 100);
-
- int Pid = Channel->Vpid();
-@@ -119,6 +119,8 @@
- time_t t = time(NULL);
- bool InfoWritten = false;
- bool FirstIframeSeen = false;
-+ int FileNumber = 0;
-+ off_t FrameOffset = -1;
- while (Running()) {
- int r;
- uchar *b = ringBuffer->Get(r);
-@@ -131,7 +133,7 @@
- if (!InfoWritten) {
- cRecordingInfo RecordingInfo(recordingName);
- if (RecordingInfo.Read()) {
-- if (frameDetector->FramesPerSecond() > 0 && !DoubleEqual(RecordingInfo.FramesPerSecond(), frameDetector->FramesPerSecond())) {
-+ if (frameDetector->FramesPerSecond() > 0 && DoubleEqual(RecordingInfo.FramesPerSecond(), DEFAULTFRAMESPERSECOND) && !DoubleEqual(RecordingInfo.FramesPerSecond(), frameDetector->FramesPerSecond())) {
- RecordingInfo.SetFramesPerSecond(frameDetector->FramesPerSecond());
- RecordingInfo.Write();
- Recordings.UpdateByName(recordingName);
-@@ -139,12 +141,16 @@
- }
- InfoWritten = true;
- }
-+ if (frameDetector->NewPayload()) {
-+ FileNumber = fileName->Number();
-+ FrameOffset = fileSize;
-+ }
- if (FirstIframeSeen || frameDetector->IndependentFrame()) {
- FirstIframeSeen = true; // start recording with the first I-frame
- if (!NextFile())
- break;
- if (index && frameDetector->NewFrame())
-- index->Write(frameDetector->IndependentFrame(), fileName->Number(), fileSize);
-+ index->Write(frameDetector->IndependentFrame(), FileNumber, FrameOffset);
- if (frameDetector->IndependentFrame()) {
- recordFile->Write(patPmtGenerator.GetPat(), TS_SIZE);
- fileSize += TS_SIZE;
-diff -ruN vdr-1.7.18/recording.c vdr-1.7.19/recording.c
---- vdr-1.7.18/recording.c 2011-04-17 15:53:11.000000000 +0200
-+++ vdr-1.7.19/recording.c 2011-06-12 15:04:28.000000000 +0200
-@@ -4,7 +4,7 @@
- * See the main source file 'vdr.c' for copyright information and
- * how to reach the author.
- *
-- * $Id: recording.c 2.30 2011/04/17 13:53:11 kls Exp $
-+ * $Id: recording.c 2.31 2011/06/12 13:04:28 kls Exp $
- */
-
- #include "recording.h"
-@@ -1403,11 +1403,12 @@
- bool Rewind = false;
- cFileName FileName(recordingName, false);
- cUnbufferedFile *ReplayFile = FileName.Open();
-- cRingBufferLinear Buffer(IFG_BUFFER_SIZE, MIN_TS_PACKETS_FOR_FRAME_DETECTOR * TS_SIZE);
-+ cRingBufferLinear Buffer(IFG_BUFFER_SIZE, TS_SIZE);
- cPatPmtParser PatPmtParser;
- cFrameDetector FrameDetector;
- cIndexFile IndexFile(recordingName, true);
- int BufferChunks = KILOBYTE(1); // no need to read a lot at the beginning when parsing PAT/PMT
-+ int FileNumber = 0;
- off_t FileSize = 0;
- off_t FrameOffset = -1;
- Skins.QueueMessage(mtInfo, tr("Regenerating index file"));
-@@ -1424,12 +1425,18 @@
- if (Data) {
- if (FrameDetector.Synced()) {
- // Step 3 - generate the index:
-- if (TsPid(Data) == PATPID)
-+ if (FrameOffset < 0 && TsPid(Data) == PATPID) {
-+ FileNumber = FileName.Number();
- FrameOffset = FileSize; // the PAT/PMT is at the beginning of an I-frame
-+ }
- int Processed = FrameDetector.Analyze(Data, Length);
- if (Processed > 0) {
-+ if (FrameDetector.NewPayload() && FrameOffset < 0) {
-+ FileNumber = FileName.Number();
-+ FrameOffset = FileSize;
-+ }
- if (FrameDetector.NewFrame()) {
-- IndexFile.Write(FrameDetector.IndependentFrame(), FileName.Number(), FrameOffset >= 0 ? FrameOffset : FileSize);
-+ IndexFile.Write(FrameDetector.IndependentFrame(), FileNumber, FrameOffset);
- FrameOffset = -1;
- }
- FileSize += Processed;
-diff -ruN vdr-1.7.18/remux.c vdr-1.7.19/remux.c
---- vdr-1.7.18/remux.c 2011-03-20 11:21:14.000000000 +0100
-+++ vdr-1.7.19/remux.c 2011-06-12 16:24:09.000000000 +0200
-@@ -4,7 +4,7 @@
- * See the main source file 'vdr.c' for copyright information and
- * how to reach the author.
- *
-- * $Id: remux.c 2.53 2011/03/20 10:21:14 kls Exp $
-+ * $Id: remux.c 2.57 2011/06/12 14:24:09 kls Exp $
- */
-
- #include "remux.h"
-@@ -12,6 +12,7 @@
- #include "libsi/si.h"
- #include "libsi/section.h"
- #include "libsi/descriptor.h"
-+#include "recording.h"
- #include "shutdown.h"
- #include "tools.h"
-
-@@ -781,7 +782,8 @@
- {
- SetPid(Pid, Type);
- synced = false;
-- newFrame = independentFrame = false;
-+ newPayload = newFrame = independentFrame = false;
-+ frameTypeOffset = -1;
- numPtsValues = 0;
- numFrames = 0;
- numIFrames = 0;
-@@ -808,7 +810,8 @@
-
- void cFrameDetector::Reset(void)
- {
-- newFrame = independentFrame = false;
-+ newPayload = newFrame = independentFrame = false;
-+ frameTypeOffset = -1;
- payloadUnitOfFrame = 0;
- scanning = false;
- scanner = EMPTY_SCANNER;
-@@ -816,9 +819,8 @@
-
- int cFrameDetector::Analyze(const uchar *Data, int Length)
- {
-- int SeenPayloadStart = false;
- int Processed = 0;
-- newFrame = independentFrame = false;
-+ newPayload = newFrame = independentFrame = false;
- while (Length >= TS_SIZE) {
- if (Data[0] != TS_SYNC_BYTE) {
- int Skipped = 1;
-@@ -831,16 +833,13 @@
- int Pid = TsPid(Data);
- if (Pid == pid) {
- if (TsPayloadStart(Data)) {
-- SeenPayloadStart = true;
- if (synced && Processed)
-- return Processed;
-- if (Length < MIN_TS_PACKETS_FOR_FRAME_DETECTOR * TS_SIZE)
-- return Processed; // need more data, in case the frame type is not stored in the first TS packet
-+ return Processed; // flush everything before this new payload
- if (framesPerSecond <= 0.0) {
- // frame rate unknown, so collect a sequence of PTS values:
- if (numPtsValues < MaxPtsValues && numIFrames < 2) { // collect a sequence containing at least two I-frames
- const uchar *Pes = Data + TsPayloadOffset(Data);
-- if (PesHasPts(Pes)) {
-+ if (numIFrames && PesHasPts(Pes)) {
- ptsValues[numPtsValues] = PesGetPts(Pes);
- // check for rollover:
- if (numPtsValues && ptsValues[numPtsValues - 1] > 0xF0000000 && ptsValues[numPtsValues] < 0x10000000) {
-@@ -885,8 +884,8 @@
- else
- framesPerSecond = 60.0 / 1.001;
- else {
-- framesPerSecond = 25.0;
-- dsyslog("unknown frame delta (%d), assuming 25 fps", Delta);
-+ framesPerSecond = DEFAULTFRAMESPERSECOND;
-+ dsyslog("unknown frame delta (%d), assuming %5.2f fps", Delta, DEFAULTFRAMESPERSECOND);
- }
- }
- else // audio
-@@ -900,6 +899,10 @@
- if (scanning) {
- int PayloadOffset = TsPayloadOffset(Data);
- if (TsPayloadStart(Data)) {
-+ if (synced && Processed)
-+ return Processed; // flush everything before this new payload
-+ newPayload = true;
-+ scanner = EMPTY_SCANNER;
- PayloadOffset += PesPayloadOffset(Data + PayloadOffset);
- if (!framesPerPayloadUnit)
- framesPerPayloadUnit = framesInPayloadUnit;
-@@ -907,17 +910,30 @@
- dbgframes("/");
- }
- for (int i = PayloadOffset; scanning && i < TS_SIZE; i++) {
-- scanner <<= 8;
-- scanner |= Data[i];
-+ if (frameTypeOffset < 0) {
-+ scanner <<= 8;
-+ scanner |= Data[i];
-+ }
-+ else
-+ frameTypeOffset += PayloadOffset;
- switch (type) {
- case 0x01: // MPEG 1 video
- case 0x02: // MPEG 2 video
- if (scanner == 0x00000100) { // Picture Start Code
-+ if (frameTypeOffset < 0) {
-+ frameTypeOffset = i + 2;
-+ if (frameTypeOffset >= TS_SIZE) { // the byte to check is in the next TS packet
-+ frameTypeOffset -= TS_SIZE;
-+ if (!synced)
-+ dbgframes("%d>", frameTypeOffset);
-+ break;
-+ }
-+ }
- scanner = EMPTY_SCANNER;
-- if (synced && !SeenPayloadStart && Processed)
-- return Processed; // flush everything before this new frame
- newFrame = true;
-- independentFrame = ((Data[i + 2] >> 3) & 0x07) == 1; // I-Frame
-+ uchar FrameType = (Data[frameTypeOffset] >> 3) & 0x07;
-+ frameTypeOffset = -1;
-+ independentFrame = FrameType == 1; // I-Frame
- if (synced) {
- if (framesPerPayloadUnit <= 1)
- scanning = false;
-@@ -928,7 +944,7 @@
- numIFrames++;
- if (numIFrames == 1)
- numFrames++;
-- dbgframes("%d ", (Data[i + 2] >> 3) & 0x07);
-+ dbgframes("%u ", FrameType);
- }
- if (synced)
- return Processed + TS_SIZE; // flag this new frame
-@@ -936,11 +952,20 @@
- break;
- case 0x1B: // MPEG 4 video
- if (scanner == 0x00000109) { // Access Unit Delimiter
-+ if (frameTypeOffset < 0) {
-+ frameTypeOffset = i + 1;
-+ if (frameTypeOffset >= TS_SIZE) { // the byte to check is in the next TS packet
-+ frameTypeOffset -= TS_SIZE;
-+ if (!synced)
-+ dbgframes("%d>", frameTypeOffset);
-+ break;
-+ }
-+ }
- scanner = EMPTY_SCANNER;
-- if (synced && !SeenPayloadStart && Processed)
-- return Processed; // flush everything before this new frame
- newFrame = true;
-- independentFrame = Data[i + 1] == 0x10;
-+ uchar FrameType = Data[frameTypeOffset];
-+ frameTypeOffset = -1;
-+ independentFrame = FrameType == 0x10;
- if (synced) {
- if (framesPerPayloadUnit < 0) {
- payloadUnitOfFrame = (payloadUnitOfFrame + 1) % -framesPerPayloadUnit;
-@@ -958,7 +983,7 @@
- numIFrames++;
- if (numIFrames == 1)
- numFrames++;
-- dbgframes("%02X ", Data[i + 1]);
-+ dbgframes("%02X ", FrameType);
- }
- if (synced)
- return Processed + TS_SIZE; // flag this new frame
-diff -ruN vdr-1.7.18/remux.h vdr-1.7.19/remux.h
---- vdr-1.7.18/remux.h 2011-03-19 17:52:46.000000000 +0100
-+++ vdr-1.7.19/remux.h 2011-06-12 14:49:17.000000000 +0200
-@@ -4,7 +4,7 @@
- * See the main source file 'vdr.c' for copyright information and
- * how to reach the author.
- *
-- * $Id: remux.h 2.28 2011/03/19 16:52:46 kls Exp $
-+ * $Id: remux.h 2.30 2011/06/12 12:49:17 kls Exp $
- */
-
- #ifndef __REMUX_H
-@@ -84,15 +84,18 @@
-
- inline int TsPayloadOffset(const uchar *p)
- {
-- int o = (p[3] & TS_ADAPT_FIELD_EXISTS) ? p[4] + 5 : 4;
-+ int o = TsHasAdaptationField(p) ? p[4] + 5 : 4;
- return o <= TS_SIZE ? o : TS_SIZE;
- }
-
- inline int TsGetPayload(const uchar **p)
- {
-- int o = TsPayloadOffset(*p);
-- *p += o;
-- return TS_SIZE - o;
-+ if (TsHasPayload(*p)) {
-+ int o = TsPayloadOffset(*p);
-+ *p += o;
-+ return TS_SIZE - o;
-+ }
-+ return 0;
- }
-
- inline int TsContinuityCounter(const uchar *p)
-@@ -294,7 +297,7 @@
- ~cTsToPes();
- void PutTs(const uchar *Data, int Length);
- ///< Puts the payload data of the single TS packet at Data into the converter.
-- ///< Length is always 188.
-+ ///< Length is always TS_SIZE.
- ///< If the given TS packet starts a new PES payload packet, the converter
- ///< will be automatically reset. Any packets before the first one that starts
- ///< a new PES payload packet will be ignored.
-@@ -333,16 +336,16 @@
-
- // Frame detector:
-
--#define MIN_TS_PACKETS_FOR_FRAME_DETECTOR 2
--
- class cFrameDetector {
- private:
- enum { MaxPtsValues = 150 };
- int pid;
- int type;
- bool synced;
-+ bool newPayload;
- bool newFrame;
- bool independentFrame;
-+ int frameTypeOffset;
- uint32_t ptsValues[MaxPtsValues]; // 32 bit is enough - we only need the delta
- int numPtsValues;
- int numFrames;
-@@ -368,12 +371,17 @@
- ///< the frame detector for actual work.
- int Analyze(const uchar *Data, int Length);
- ///< Analyzes the TS packets pointed to by Data. Length is the number of
-- ///< bytes Data points to, and must be a multiple of 188.
-+ ///< bytes Data points to, and must be a multiple of TS_SIZE.
- ///< Returns the number of bytes that have been analyzed.
- ///< If the return value is 0, the data was not sufficient for analyzing and
- ///< Analyze() needs to be called again with more actual data.
- bool Synced(void) { return synced; }
- ///< Returns true if the frame detector has synced on the data stream.
-+ bool NewPayload(void) { return newPayload; }
-+ ///< Returns true if the data given to the last call to Analyze() started a
-+ ///< new payload. The caller should remember the current file offset in
-+ ///< order to be able to generate an index entry later, when NewFrame()
-+ ///< returns true.
- bool NewFrame(void) { return newFrame; }
- ///< Returns true if the data given to the last call to Analyze() started a
- ///< new frame.
diff --git a/multimedia/vdr/files/vdr-1.7.19-ttxtsubs.patch-3 b/multimedia/vdr/files/vdr-1.7.19-ttxtsubs.patch-3
deleted file mode 100644
index 4f5f1bb830df..000000000000
--- a/multimedia/vdr/files/vdr-1.7.19-ttxtsubs.patch-3
+++ /dev/null
@@ -1,21 +0,0 @@
---- a/ci.c
-+++ b/ci.c
-@@ -1917,6 +1917,8 @@ void cCamSlot::AddChannel(const cChannel
- AddPid(Channel->Sid(), *Dpid, STREAM_TYPE_PRIVATE);
- for (const int *Spid = Channel->Spids(); *Spid; Spid++)
- AddPid(Channel->Sid(), *Spid, STREAM_TYPE_PRIVATE);
-+ if (Channel->Tpid() && Setup.SupportTeletext)
-+ AddPid(Channel->Sid(), Channel->Tpid(), STREAM_TYPE_PRIVATE);
- }
- }
-
-@@ -1940,6 +1942,9 @@ bool cCamSlot::CanDecrypt(const cChannel
- CaPmt.AddPid(*Dpid, STREAM_TYPE_PRIVATE);
- for (const int *Spid = Channel->Spids(); *Spid; Spid++)
- CaPmt.AddPid(*Spid, STREAM_TYPE_PRIVATE);
-+ if (Channel->Tpid() && Setup.SupportTeletext) {
-+ CaPmt.AddPid(Channel->Tpid(), STREAM_TYPE_PRIVATE);
-+ }
- cas->SendPMT(&CaPmt);
- cTimeMs Timeout(QUERY_REPLY_TIMEOUT);
- do {
diff --git a/multimedia/vdr/files/vdr-1.7.15-ttxtsubs.patch-1 b/multimedia/vdr/files/vdr-1.7.21-ttxtsubs.patch-1
index 45e8def1bd8e..d31f4234cfb9 100644
--- a/multimedia/vdr/files/vdr-1.7.15-ttxtsubs.patch-1
+++ b/multimedia/vdr/files/vdr-1.7.21-ttxtsubs.patch-1
@@ -1,5 +1,5 @@
diff --git a/MANUAL b/MANUAL
-index 7fae53b..6b0ae57 100644
+index 54e166e..57b687f 100644
--- a/MANUAL
+++ b/MANUAL
@@ -730,6 +730,9 @@ Version 1.6
@@ -13,10 +13,10 @@ index 7fae53b..6b0ae57 100644
SLOF = 11700 The switching frequency (in MHz) between low and
diff --git a/Makefile b/Makefile
-index d788484..f854b2e 100644
+index 18d7eb9..3da4382 100644
--- a/Makefile
+++ b/Makefile
-@@ -44,6 +44,8 @@ OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o d
+@@ -45,6 +45,8 @@ OBJS = audio.o channels.o ci.o config.o cutter.o device.o diseqc.o dvbdevice.o d
skinclassic.o skins.o skinsttng.o sourceparams.o sources.o spu.o status.o svdrp.o themes.o thread.o\
timers.o tools.o transfer.o vdr.o videodir.o
@@ -25,14 +25,97 @@ index d788484..f854b2e 100644
ifndef NO_KBD
DEFINES += -DREMOTE_KBD
endif
+diff --git a/channels.c b/channels.c
+index b9204f2..44d4be2 100644
+--- a/channels.c
++++ b/channels.c
+@@ -378,6 +378,26 @@ void cChannel::SetSubtitlingDescriptors(uchar *SubtitlingTypes, uint16_t *Compos
+ }
+ }
+
++void cChannel::SetTeletextSubtitlePages(tTeletextSubtitlePage pages[], int numberOfPages)
++{
++ int mod = CHANNELMOD_NONE;
++ if (totalTtxtSubtitlePages != (fixedTtxtSubtitlePages + numberOfPages))
++ mod |= CHANNELMOD_PIDS;
++ totalTtxtSubtitlePages = fixedTtxtSubtitlePages;
++ for (int i = 0; (i < numberOfPages) && (totalTtxtSubtitlePages < MAXTXTPAGES); i++) {
++ if (teletextSubtitlePages[totalTtxtSubtitlePages].ttxtMagazine != pages[i].ttxtMagazine ||
++ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtPage != pages[i].ttxtPage ||
++ teletextSubtitlePages[totalTtxtSubtitlePages].ttxtType != pages[i].ttxtType ||
++ strcmp(teletextSubtitlePages[totalTtxtSubtitlePages].ttxtLanguage, pages[i].ttxtLanguage)) {
++ mod |= CHANNELMOD_PIDS;
++ teletextSubtitlePages[totalTtxtSubtitlePages] = pages[i];
++ }
++ totalTtxtSubtitlePages++;
++ }
++ modification |= mod;
++ Channels.SetModified();
++}
++
+ void cChannel::SetCaIds(const int *CaIds)
+ {
+ if (caids[0] && caids[0] <= CA_USER_MAX)
+@@ -506,10 +526,17 @@ cString cChannel::ToText(const cChannel *Channel)
+ q += IntArrayToString(q, Channel->dpids, 10, Channel->dlangs, Channel->dtypes);
+ }
+ *q = 0;
+- const int TBufferSize = MAXSPIDS * (5 + 1 + MAXLANGCODE2) + 10; // 5 digits plus delimiting ',' or ';' plus optional '=cod+cod', +10: paranoia and tpid
++ const int TBufferSize = (MAXTXTPAGES * MAXSPIDS) * (5 + 1 + MAXLANGCODE2) + 10; // 5 digits plus delimiting ',' or ';' plus optional '=cod+cod', +10: paranoia and tpid
+ char tpidbuf[TBufferSize];
+ q = tpidbuf;
+ q += snprintf(q, sizeof(tpidbuf), "%d", Channel->tpid);
++ if (Channel->fixedTtxtSubtitlePages > 0) {
++ *q++ = '+';
++ for (int i = 0; i < Channel->fixedTtxtSubtitlePages; ++i) {
++ tTeletextSubtitlePage page = Channel->teletextSubtitlePages[i];
++ q += snprintf(q, sizeof(tpidbuf) - (q - tpidbuf), "%d=%s", page.PageNumber(), page.ttxtLanguage);
++ }
++ }
+ if (Channel->spids[0]) {
+ *q++ = ';';
+ q += IntArrayToString(q, Channel->spids, 10, Channel->slangs);
+@@ -678,6 +705,32 @@ bool cChannel::Parse(const char *s)
+ }
+ spids[NumSpids] = 0;
+ }
++ fixedTtxtSubtitlePages = 0;
++ if ((p = strchr(tpidbuf, '+')) != NULL) {
++ *p++ = 0;
++ char *q;
++ char *strtok_next;
++ while ((q = strtok_r(p, ",", &strtok_next)) != NULL) {
++ if (fixedTtxtSubtitlePages < MAXTXTPAGES) {
++ int page;
++ char *l = strchr(q, '=');
++ if (l)
++ *l++ = 0;
++ if (sscanf(q, "%d", &page) == 1) {
++ teletextSubtitlePages[fixedTtxtSubtitlePages] = tTeletextSubtitlePage(page);
++ if (l)
++ strn0cpy(teletextSubtitlePages[fixedTtxtSubtitlePages].ttxtLanguage, l, MAXLANGCODE2);
++ fixedTtxtSubtitlePages++;
++ }
++ else
++ esyslog("ERROR: invalid Teletext page!"); // no need to set ok to 'false'
++ }
++ else
++ esyslog("ERROR: too many Teletext pages!"); // no need to set ok to 'false'
++ p = NULL;
++ }
++ totalTtxtSubtitlePages = fixedTtxtSubtitlePages;
++ }
+ if (sscanf(tpidbuf, "%d", &tpid) != 1)
+ return false;
+ if (caidbuf) {
diff --git a/channels.h b/channels.h
-index b867297..63c8b9c 100644
+index 51f9830..6e7367f 100644
--- a/channels.h
+++ b/channels.h
@@ -35,6 +35,7 @@
#define MAXDPIDS 16 // dolby (AC3 + DTS)
#define MAXSPIDS 32 // subtitles
- #define MAXCAIDS 8 // conditional access
+ #define MAXCAIDS 12 // conditional access
+#define MAXTXTPAGES 8 // teletext pages
#define MAXLANGCODE1 4 // a 3 letter language code, zero terminated
@@ -81,8 +164,31 @@ index b867297..63c8b9c 100644
void SetCaIds(const int *CaIds); // list must be zero-terminated
void SetCaDescriptors(int Level);
void SetLinkChannels(cLinkChannels *LinkChannels);
+diff --git a/ci.c b/ci.c
+index 59d62ef..b024f67 100644
+--- a/ci.c
++++ b/ci.c
+@@ -1913,6 +1913,8 @@ void cCamSlot::AddChannel(const cChannel *Channel)
+ AddPid(Channel->Sid(), *Dpid, STREAM_TYPE_PRIVATE);
+ for (const int *Spid = Channel->Spids(); *Spid; Spid++)
+ AddPid(Channel->Sid(), *Spid, STREAM_TYPE_PRIVATE);
++ if (Channel->Tpid() && Setup.SupportTeletext)
++ AddPid(Channel->Sid(), Channel->Tpid(), STREAM_TYPE_PRIVATE);
+ }
+ }
+
+@@ -1936,6 +1938,9 @@ bool cCamSlot::CanDecrypt(const cChannel *Channel)
+ CaPmt.AddPid(*Dpid, STREAM_TYPE_PRIVATE);
+ for (const int *Spid = Channel->Spids(); *Spid; Spid++)
+ CaPmt.AddPid(*Spid, STREAM_TYPE_PRIVATE);
++ if (Channel->Tpid() && Setup.SupportTeletext) {
++ CaPmt.AddPid(Channel->Tpid(), STREAM_TYPE_PRIVATE);
++ }
+ cas->SendPMT(&CaPmt);
+ cTimeMs Timeout(QUERY_REPLY_TIMEOUT);
+ do {
diff --git a/config.c b/config.c
-index 73b11b1..f2eebe6 100644
+index 73bb00d..982bd78 100644
--- a/config.c
+++ b/config.c
@@ -333,6 +333,7 @@ cSetup::cSetup(void)
@@ -93,7 +199,7 @@ index 73b11b1..f2eebe6 100644
SubtitleLanguages[0] = -1;
SubtitleOffset = 0;
SubtitleFgTransparency = 0;
-@@ -524,6 +525,7 @@ bool cSetup::Parse(const char *Name, const char *Value)
+@@ -525,6 +526,7 @@ bool cSetup::Parse(const char *Name, const char *Value)
else if (!strcasecmp(Name, "MarginStop")) MarginStop = atoi(Value);
else if (!strcasecmp(Name, "AudioLanguages")) return ParseLanguages(Value, AudioLanguages);
else if (!strcasecmp(Name, "DisplaySubtitles")) DisplaySubtitles = atoi(Value);
@@ -101,7 +207,7 @@ index 73b11b1..f2eebe6 100644
else if (!strcasecmp(Name, "SubtitleLanguages")) return ParseLanguages(Value, SubtitleLanguages);
else if (!strcasecmp(Name, "SubtitleOffset")) SubtitleOffset = atoi(Value);
else if (!strcasecmp(Name, "SubtitleFgTransparency")) SubtitleFgTransparency = atoi(Value);
-@@ -620,6 +622,7 @@ bool cSetup::Save(void)
+@@ -621,6 +623,7 @@ bool cSetup::Save(void)
Store("MarginStop", MarginStop);
StoreLanguages("AudioLanguages", AudioLanguages);
Store("DisplaySubtitles", DisplaySubtitles);
@@ -110,7 +216,7 @@ index 73b11b1..f2eebe6 100644
Store("SubtitleOffset", SubtitleOffset);
Store("SubtitleFgTransparency", SubtitleFgTransparency);
diff --git a/config.h b/config.h
-index 7041eb7..289d4b6 100644
+index c51e3df..e46b4bd 100644
--- a/config.h
+++ b/config.h
@@ -235,6 +235,7 @@ public:
@@ -122,7 +228,7 @@ index 7041eb7..289d4b6 100644
int SubtitleOffset;
int SubtitleFgTransparency, SubtitleBgTransparency;
diff --git a/device.c b/device.c
-index 681049b..4dbd920 100644
+index ba098d8..84bdd30 100644
--- a/device.c
+++ b/device.c
@@ -18,6 +18,7 @@
@@ -133,7 +239,7 @@ index 681049b..4dbd920 100644
// --- cLiveSubtitle ---------------------------------------------------------
-@@ -1223,6 +1224,13 @@ int cDevice::PlayPesPacket(const uchar *Data, int Length, bool VideoOnly)
+@@ -1250,6 +1251,13 @@ int cDevice::PlayPesPacket(const uchar *Data, int Length, bool VideoOnly)
}
break;
case 0xBD: { // private stream 1
@@ -147,7 +253,7 @@ index 681049b..4dbd920 100644
int PayloadOffset = Data[8] + 9;
// Compatibility mode for old subtitles plugin:
-@@ -1382,6 +1390,7 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
+@@ -1409,6 +1417,7 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
tsToPesVideo.Reset();
tsToPesAudio.Reset();
tsToPesSubtitle.Reset();
@@ -155,7 +261,7 @@ index 681049b..4dbd920 100644
}
else if (Length < TS_SIZE) {
esyslog("ERROR: skipped %d bytes of TS fragment", Length);
-@@ -1427,6 +1436,17 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
+@@ -1454,6 +1463,17 @@ int cDevice::PlayTs(const uchar *Data, int Length, bool VideoOnly)
if (!VideoOnly || HasIBPTrickSpeed())
PlayTsSubtitle(Data, TS_SIZE);
}
@@ -174,10 +280,10 @@ index 681049b..4dbd920 100644
}
else if (Pid == patPmtParser.Ppid()) {
diff --git a/device.h b/device.h
-index cb3bc2c..f531e70 100644
+index fd587a8..078f080 100644
--- a/device.h
+++ b/device.h
-@@ -522,6 +522,7 @@ private:
+@@ -538,6 +538,7 @@ private:
cTsToPes tsToPesVideo;
cTsToPes tsToPesAudio;
cTsToPes tsToPesSubtitle;
@@ -186,10 +292,10 @@ index cb3bc2c..f531e70 100644
protected:
const cPatPmtParser *PatPmtParser(void) const { return &patPmtParser; }
diff --git a/menu.c b/menu.c
-index 19cfabb..d2deeb3 100644
+index ef2bb46..3548ccd 100644
--- a/menu.c
+++ b/menu.c
-@@ -2790,6 +2790,7 @@ void cMenuSetupDVB::Setup(void)
+@@ -2798,6 +2798,7 @@ void cMenuSetupDVB::Setup(void)
Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle foreground transparency"), &data.SubtitleFgTransparency, 0, 9));
Add(new cMenuEditIntItem( tr("Setup.DVB$Subtitle background transparency"), &data.SubtitleBgTransparency, 0, 10));
}
@@ -198,10 +304,10 @@ index 19cfabb..d2deeb3 100644
SetCurrent(Get(current));
Display();
diff --git a/po/ca_ES.po b/po/ca_ES.po
-index 247113b..aba1ae3 100644
+index b104fea..1c09d79 100644
--- a/po/ca_ES.po
+++ b/po/ca_ES.po
-@@ -943,6 +943,9 @@ msgstr "Transpar
+@@ -950,6 +950,9 @@ msgstr "Transpar
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Transparncia fons subttols"
@@ -212,10 +318,10 @@ index 247113b..aba1ae3 100644
msgstr "Configuraci de l'LNB"
diff --git a/po/cs_CZ.po b/po/cs_CZ.po
-index f6313ba..aec6f4e 100644
+index bcafac7..370609f 100644
--- a/po/cs_CZ.po
+++ b/po/cs_CZ.po
-@@ -942,6 +942,9 @@ msgstr "Průhlednost písma titulků"
+@@ -949,6 +949,9 @@ msgstr "Průhlednost písma titulků"
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Průhlednost pozadí titulků"
@@ -226,10 +332,10 @@ index f6313ba..aec6f4e 100644
msgstr "LNB"
diff --git a/po/da_DK.po b/po/da_DK.po
-index 40cdebd..192173d 100644
+index 81b11eb..5daca8d 100644
--- a/po/da_DK.po
+++ b/po/da_DK.po
-@@ -940,6 +940,9 @@ msgstr "Undertekst forgrundsgennemsigtighed"
+@@ -947,6 +947,9 @@ msgstr "Undertekst forgrundsgennemsigtighed"
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Undertekst baggrundsgennemsigtighed"
@@ -240,10 +346,10 @@ index 40cdebd..192173d 100644
msgstr "LNB"
diff --git a/po/de_DE.po b/po/de_DE.po
-index 4d4f3df..a3227a0 100644
+index 6d5b822..0a00a5a 100644
--- a/po/de_DE.po
+++ b/po/de_DE.po
-@@ -940,6 +940,9 @@ msgstr "Untertitel-Transparenz Vordergrund"
+@@ -947,6 +947,9 @@ msgstr "Untertitel-Transparenz Vordergrund"
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Untertitel-Transparenz Hintergrund"
@@ -254,10 +360,10 @@ index 4d4f3df..a3227a0 100644
msgstr "LNB"
diff --git a/po/el_GR.po b/po/el_GR.po
-index 5414ebc..913f39e 100644
+index 9756ea7..5d4d6ea 100644
--- a/po/el_GR.po
+++ b/po/el_GR.po
-@@ -940,6 +940,9 @@ msgstr ""
+@@ -947,6 +947,9 @@ msgstr ""
msgid "Setup.DVB$Subtitle background transparency"
msgstr ""
@@ -268,10 +374,10 @@ index 5414ebc..913f39e 100644
msgstr "LNB"
diff --git a/po/es_ES.po b/po/es_ES.po
-index 217f775..78a9491 100644
+index 193e75e..1f36b60 100644
--- a/po/es_ES.po
+++ b/po/es_ES.po
-@@ -941,6 +941,9 @@ msgstr "Transparencia primer plano subt
+@@ -948,6 +948,9 @@ msgstr "Transparencia primer plano subt
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Transparencia fondo subttulos"
@@ -282,10 +388,10 @@ index 217f775..78a9491 100644
msgstr "LNB"
diff --git a/po/et_EE.po b/po/et_EE.po
-index 5010dc4..af2e2d3 100644
+index 49794dd..83ff319 100644
--- a/po/et_EE.po
+++ b/po/et_EE.po
-@@ -940,6 +940,9 @@ msgstr "Subtiitri l
+@@ -947,6 +947,9 @@ msgstr "Subtiitri l
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Subtiitri tausta lbipaistvus"
@@ -296,10 +402,10 @@ index 5010dc4..af2e2d3 100644
msgstr "LNB"
diff --git a/po/fi_FI.po b/po/fi_FI.po
-index cd57e7c..e6a22bf 100644
+index b093e88..4abf6a8 100644
--- a/po/fi_FI.po
+++ b/po/fi_FI.po
-@@ -943,6 +943,9 @@ msgstr "Tekstityksen läpinäkyvyys"
+@@ -950,6 +950,9 @@ msgstr "Tekstityksen läpinäkyvyys"
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Tekstityksen taustan läpinäkyvyys"
@@ -310,10 +416,10 @@ index cd57e7c..e6a22bf 100644
msgstr "LNB"
diff --git a/po/fr_FR.po b/po/fr_FR.po
-index 0d4cb7c..770038e 100644
+index b5c5120..86a961a 100644
--- a/po/fr_FR.po
+++ b/po/fr_FR.po
-@@ -946,6 +946,9 @@ msgstr "Transparence de l'avant-plan"
+@@ -953,6 +953,9 @@ msgstr "Transparence de l'avant-plan"
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Transparence du fond"
@@ -324,10 +430,10 @@ index 0d4cb7c..770038e 100644
msgstr "LNB"
diff --git a/po/hr_HR.po b/po/hr_HR.po
-index 96ee695..51f596c 100644
+index ed519a2..43f2ea5 100644
--- a/po/hr_HR.po
+++ b/po/hr_HR.po
-@@ -942,6 +942,9 @@ msgstr "Transparentnost titla"
+@@ -949,6 +949,9 @@ msgstr "Transparentnost titla"
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Transparentnost pozadine titla"
@@ -338,10 +444,10 @@ index 96ee695..51f596c 100644
msgstr "LNB"
diff --git a/po/hu_HU.po b/po/hu_HU.po
-index a17b209..2f70812 100644
+index 17b905f..06f4505 100644
--- a/po/hu_HU.po
+++ b/po/hu_HU.po
-@@ -943,6 +943,9 @@ msgstr "Felirat transzparenci
+@@ -950,6 +950,9 @@ msgstr "Felirat transzparenci
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Felirat htternek transzparencija"
@@ -352,10 +458,10 @@ index a17b209..2f70812 100644
msgstr "LNB"
diff --git a/po/it_IT.po b/po/it_IT.po
-index 89d4237..5a055b2 100644
+index 501300e..e0227d3 100644
--- a/po/it_IT.po
+++ b/po/it_IT.po
-@@ -947,6 +947,9 @@ msgstr "Trasparenza sottotitoli"
+@@ -954,6 +954,9 @@ msgstr "Trasparenza sottotitoli"
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Trasparenza sfondo sottotitoli"
@@ -366,10 +472,10 @@ index 89d4237..5a055b2 100644
msgstr "LNB"
diff --git a/po/lt_LT.po b/po/lt_LT.po
-index 02465e6..8b5d996 100644
+index 6cb1faa..4efc707 100644
--- a/po/lt_LT.po
+++ b/po/lt_LT.po
-@@ -940,6 +940,9 @@ msgstr "Subtitrų priekinio vaizdo permatomumas"
+@@ -947,6 +947,9 @@ msgstr "Subtitrų fonto permatomumas"
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Subtitrų fono permatomumas"
@@ -380,10 +486,10 @@ index 02465e6..8b5d996 100644
msgstr "Konverteris (LNB)"
diff --git a/po/nl_NL.po b/po/nl_NL.po
-index f570337..73a02b3 100644
+index ae2b85e..34a71e9 100644
--- a/po/nl_NL.po
+++ b/po/nl_NL.po
-@@ -944,6 +944,9 @@ msgstr "Transparantie voorgrond ondertiteling"
+@@ -951,6 +951,9 @@ msgstr "Transparantie voorgrond ondertiteling"
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Transparantie achtergrond ondertiteling"
@@ -394,10 +500,10 @@ index f570337..73a02b3 100644
msgstr "LNB"
diff --git a/po/nn_NO.po b/po/nn_NO.po
-index 2f40cfe..0934c9a 100644
+index 8ec8dfb..9c129ee 100644
--- a/po/nn_NO.po
+++ b/po/nn_NO.po
-@@ -941,6 +941,9 @@ msgstr ""
+@@ -948,6 +948,9 @@ msgstr ""
msgid "Setup.DVB$Subtitle background transparency"
msgstr ""
@@ -408,10 +514,10 @@ index 2f40cfe..0934c9a 100644
msgstr "LNB"
diff --git a/po/pl_PL.po b/po/pl_PL.po
-index 9620e1b..39057fd 100644
+index a5c1b47..9645eca 100644
--- a/po/pl_PL.po
+++ b/po/pl_PL.po
-@@ -941,6 +941,9 @@ msgstr "Prze
+@@ -948,6 +948,9 @@ msgstr "Prze
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Przerocze podtytuw: To"
@@ -422,12 +528,12 @@ index 9620e1b..39057fd 100644
msgstr "LNB"
diff --git a/po/pt_PT.po b/po/pt_PT.po
-index 0510d9d..3bea1f1 100644
+index c443312..3c108ea 100644
--- a/po/pt_PT.po
+++ b/po/pt_PT.po
-@@ -940,6 +940,9 @@ msgstr "Transpar
+@@ -948,6 +948,9 @@ msgstr "Transpar
msgid "Setup.DVB$Subtitle background transparency"
- msgstr "Transparncia de background das legendas"
+ msgstr "Transparncia de fundo das legendas"
+msgid "Setup.DVB$Enable teletext support"
+msgstr ""
@@ -436,10 +542,10 @@ index 0510d9d..3bea1f1 100644
msgstr "LNB"
diff --git a/po/ro_RO.po b/po/ro_RO.po
-index e0a2119..1d4a412 100644
+index f8c5a1e..35ec9ec 100644
--- a/po/ro_RO.po
+++ b/po/ro_RO.po
-@@ -943,6 +943,9 @@ msgstr "Transparen
+@@ -950,6 +950,9 @@ msgstr "Transparen
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Transparena fundalului subtitrrii"
@@ -450,10 +556,10 @@ index e0a2119..1d4a412 100644
msgstr "LNB"
diff --git a/po/ru_RU.po b/po/ru_RU.po
-index 889b98b..89029e1 100644
+index e683b8b..b90e565 100644
--- a/po/ru_RU.po
+++ b/po/ru_RU.po
-@@ -941,6 +941,9 @@ msgstr "
+@@ -948,6 +948,9 @@ msgstr "
msgid "Setup.DVB$Subtitle background transparency"
msgstr " "
@@ -464,10 +570,10 @@ index 889b98b..89029e1 100644
msgstr ""
diff --git a/po/sk_SK.po b/po/sk_SK.po
-index 129fad3..eff0bd1 100644
+index 46edef5..aabb641 100644
--- a/po/sk_SK.po
+++ b/po/sk_SK.po
-@@ -941,6 +941,9 @@ msgstr "Prieh
+@@ -947,6 +947,9 @@ msgstr "Prieh
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Priehadnos pozadia titulkov"
@@ -478,10 +584,10 @@ index 129fad3..eff0bd1 100644
msgstr "LNB"
diff --git a/po/sl_SI.po b/po/sl_SI.po
-index 9f1e806..7f2bdd7 100644
+index 89c6923..8ef4387 100644
--- a/po/sl_SI.po
+++ b/po/sl_SI.po
-@@ -941,6 +941,9 @@ msgstr "Transparentnost podnapisov"
+@@ -948,6 +948,9 @@ msgstr "Transparentnost podnapisov"
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Transparentnost ozadja podnapisov"
@@ -492,10 +598,10 @@ index 9f1e806..7f2bdd7 100644
msgstr "LNB"
diff --git a/po/sv_SE.po b/po/sv_SE.po
-index e9d39dd..9c366d2 100644
+index 150f95e..020c64d 100644
--- a/po/sv_SE.po
+++ b/po/sv_SE.po
-@@ -943,6 +943,9 @@ msgstr "Transparent f
+@@ -950,6 +950,9 @@ msgstr "Transparent f
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Transparent bakgrund textremsa"
@@ -506,10 +612,10 @@ index e9d39dd..9c366d2 100644
msgstr "LNB"
diff --git a/po/tr_TR.po b/po/tr_TR.po
-index 9acd1c1..50a6295 100644
+index 194943b..338c649 100644
--- a/po/tr_TR.po
+++ b/po/tr_TR.po
-@@ -940,6 +940,9 @@ msgstr "Altyaz
+@@ -947,6 +947,9 @@ msgstr "Altyaz
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Altyaz arka effaflk"
@@ -520,10 +626,10 @@ index 9acd1c1..50a6295 100644
msgstr "LNB"
diff --git a/po/uk_UA.po b/po/uk_UA.po
-index b62fca7..25e7095 100644
+index 433ec70..c0a7947 100644
--- a/po/uk_UA.po
+++ b/po/uk_UA.po
-@@ -940,6 +940,9 @@ msgstr "Прозорість переднього плану субтитрів"
+@@ -947,6 +947,9 @@ msgstr "Прозорість переднього плану субтитрів"
msgid "Setup.DVB$Subtitle background transparency"
msgstr "Прозорість заднього плану субтитрів"
@@ -534,10 +640,10 @@ index b62fca7..25e7095 100644
msgstr "Конвертер"
diff --git a/po/zh_CN.po b/po/zh_CN.po
-index bffa301..141c362 100644
+index c28fe88..8a594e3 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
-@@ -943,6 +943,9 @@ msgstr "字幕前景透明度"
+@@ -950,6 +950,9 @@ msgstr "字幕前景透明度"
msgid "Setup.DVB$Subtitle background transparency"
msgstr "字幕背景透明度"
@@ -548,10 +654,10 @@ index bffa301..141c362 100644
msgstr "切换器设置"
diff --git a/receiver.c b/receiver.c
-index 58dda78..ed28f1b 100644
+index 6a9ba04..a5c8967 100644
--- a/receiver.c
+++ b/receiver.c
-@@ -82,7 +82,8 @@ bool cReceiver::SetPids(const cChannel *Channel)
+@@ -81,7 +81,8 @@ bool cReceiver::SetPids(const cChannel *Channel)
(Channel->Ppid() == Channel->Vpid() || AddPid(Channel->Ppid())) &&
AddPids(Channel->Apids()) &&
AddPids(Channel->Dpids()) &&
@@ -562,10 +668,10 @@ index 58dda78..ed28f1b 100644
return true;
}
diff --git a/remux.c b/remux.c
-index 5206544..eea5c07 100644
+index 78ab294..4f9950f 100644
--- a/remux.c
+++ b/remux.c
-@@ -215,6 +215,29 @@ int cPatPmtGenerator::MakeSubtitlingDescriptor(uchar *Target, const char *Langua
+@@ -219,6 +219,29 @@ int cPatPmtGenerator::MakeSubtitlingDescriptor(uchar *Target, const char *Langua
return i;
}
@@ -595,7 +701,7 @@ index 5206544..eea5c07 100644
int cPatPmtGenerator::MakeLanguageDescriptor(uchar *Target, const char *Language)
{
int i = 0;
-@@ -302,6 +325,7 @@ void cPatPmtGenerator::GeneratePmt(const cChannel *Channel)
+@@ -306,6 +329,7 @@ void cPatPmtGenerator::GeneratePmt(const cChannel *Channel)
if (Channel) {
int Vpid = Channel->Vpid();
int Ppid = Channel->Ppid();
@@ -603,7 +709,7 @@ index 5206544..eea5c07 100644
uchar *p = buf;
int i = 0;
p[i++] = 0x02; // table id
-@@ -334,6 +358,10 @@ void cPatPmtGenerator::GeneratePmt(const cChannel *Channel)
+@@ -338,6 +362,10 @@ void cPatPmtGenerator::GeneratePmt(const cChannel *Channel)
i += MakeStream(buf + i, 0x06, Channel->Spid(n));
i += MakeSubtitlingDescriptor(buf + i, Channel->Slang(n), Channel->SubtitlingType(n), Channel->CompositionPageId(n), Channel->AncillaryPageId(n));
}
@@ -614,7 +720,7 @@ index 5206544..eea5c07 100644
int sl = i - SectionLength - 2 + 4; // -2 = SectionLength storage, +4 = length of CRC
buf[SectionLength] |= (sl >> 8) & 0x0F;
-@@ -407,6 +435,7 @@ void cPatPmtParser::Reset(void)
+@@ -411,6 +439,7 @@ void cPatPmtParser::Reset(void)
pmtPid = -1;
vpid = vtype = 0;
ppid = 0;
@@ -622,7 +728,7 @@ index 5206544..eea5c07 100644
}
void cPatPmtParser::ParsePat(const uchar *Data, int Length)
-@@ -492,11 +521,13 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
+@@ -496,11 +525,13 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
int NumSpids = 0;
vpid = vtype = 0;
ppid = 0;
@@ -636,7 +742,7 @@ index 5206544..eea5c07 100644
SI::PMT::Stream stream;
for (SI::Loop::Iterator it; Pmt.streamLoop.getNext(stream, it); ) {
dbgpatpmt(" stream type = %02X, pid = %d", stream.getStreamType(), stream.getPid());
-@@ -595,6 +626,28 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
+@@ -599,6 +630,28 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
spids[NumSpids]= 0;
}
break;
@@ -666,10 +772,10 @@ index 5206544..eea5c07 100644
SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d;
dbgpatpmt(" '%s'", ld->languageCode);
diff --git a/remux.h b/remux.h
-index 7b62187..6f816dc 100644
+index b882279..4af51e5 100644
--- a/remux.h
+++ b/remux.h
-@@ -171,6 +171,7 @@ protected:
+@@ -174,6 +174,7 @@ protected:
int MakeStream(uchar *Target, uchar Type, int Pid);
int MakeAC3Descriptor(uchar *Target, uchar Type);
int MakeSubtitlingDescriptor(uchar *Target, const char *Language, uchar SubtitlingType, uint16_t CompositionPageId, uint16_t AncillaryPageId);
@@ -677,7 +783,7 @@ index 7b62187..6f816dc 100644
int MakeLanguageDescriptor(uchar *Target, const char *Language);
int MakeCRC(uchar *Target, const uchar *Data, int Length);
void GeneratePmtPid(const cChannel *Channel);
-@@ -216,6 +217,7 @@ private:
+@@ -219,6 +220,7 @@ private:
int vpid;
int ppid;
int vtype;
@@ -685,7 +791,7 @@ index 7b62187..6f816dc 100644
int apids[MAXAPIDS + 1]; // list is zero-terminated
int atypes[MAXAPIDS + 1]; // list is zero-terminated
char alangs[MAXAPIDS][MAXLANGCODE2];
-@@ -228,6 +230,8 @@ private:
+@@ -231,6 +233,8 @@ private:
uint16_t compositionPageIds[MAXSPIDS];
uint16_t ancillaryPageIds[MAXSPIDS];
bool updatePrimaryDevice;
@@ -694,7 +800,7 @@ index 7b62187..6f816dc 100644
protected:
int SectionLength(const uchar *Data, int Length) { return (Length >= 3) ? ((int(Data[1]) & 0x0F) << 8)| Data[2] : 0; }
public:
-@@ -260,6 +264,9 @@ public:
+@@ -263,6 +267,9 @@ public:
int Vtype(void) const { return vtype; }
///< Returns the video stream type as defined by the current PMT, or 0 if no video
///< stream type has been detected, yet.
@@ -704,7 +810,7 @@ index 7b62187..6f816dc 100644
const int *Apids(void) const { return apids; }
const int *Dpids(void) const { return dpids; }
const int *Spids(void) const { return spids; }
-@@ -274,6 +281,8 @@ public:
+@@ -277,6 +284,8 @@ public:
uchar SubtitlingType(int i) const { return (0 <= i && i < MAXSPIDS) ? subtitlingTypes[i] : uchar(0); }
uint16_t CompositionPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? compositionPageIds[i] : uint16_t(0); }
uint16_t AncillaryPageId(int i) const { return (0 <= i && i < MAXSPIDS) ? ancillaryPageIds[i] : uint16_t(0); }
@@ -714,19 +820,18 @@ index 7b62187..6f816dc 100644
// TS to PES converter:
diff --git a/vdr.5 b/vdr.5
-index 68711b5..9b8ed05 100644
+index c46a2bf..96e142a 100644
--- a/vdr.5
+++ b/vdr.5
-@@ -214,6 +214,13 @@ if there is an audio type.
- .TP
- .B TPID
- The teletext PID.
-+
-+Fixed teletext subtitling pages can be defined separated by a semicolon.
-+The pages (separated by commas) can contain ISO 639 language codes, delimited
-+by a '=' sign, as in
+@@ -225,6 +225,12 @@ by an '=' sign, as in
+
+ .B ...:201;2001=deu,2002=eng:...
+
++Manual teletext subtitling pages can be defined separated by a '+' sign.
++The pages (separated by commas) can contain language codes, delimited by a '='
++sign, as in
+
-+.B ...:2001;150=deu,151=fin:...
++.B ...:201+150=deu,151=fin;2001,2002:...
+
.TP
.B Conditional access
diff --git a/multimedia/vdr/files/vdr-1.7.21-ttxtsubs.patch-2 b/multimedia/vdr/files/vdr-1.7.21-ttxtsubs.patch-2
new file mode 100644
index 000000000000..1cbd92de8535
--- /dev/null
+++ b/multimedia/vdr/files/vdr-1.7.21-ttxtsubs.patch-2
@@ -0,0 +1,56 @@
+diff --git a/pat.c b/pat.c
+index b7493ec..9262491 100644
+--- a/pat.c
++++ b/pat.c
+@@ -17,6 +17,7 @@
+ #include "libsi/section.h"
+ #include "libsi/descriptor.h"
+ #include "thread.h"
++#include "vdrttxtsubshooks.h"
+
+ #define PMT_SCAN_TIMEOUT 10 // seconds
+
+@@ -347,6 +348,8 @@ void cPatFilter::Process(u_short Pid, u_
+ char DLangs[MAXDPIDS][MAXLANGCODE2] = { "" };
+ char SLangs[MAXSPIDS][MAXLANGCODE2] = { "" };
+ int Tpid = 0;
++ tTeletextSubtitlePage TeletextSubtitlePages[MAXTXTPAGES];
++ int NumTPages = 0;
+ int NumApids = 0;
+ int NumDpids = 0;
+ int NumSpids = 0;
+@@ -438,8 +441,21 @@ void cPatFilter::Process(u_short Pid, u_
+ NumSpids++;
+ }
+ break;
+- case SI::TeletextDescriptorTag:
++ case SI::TeletextDescriptorTag: {
+ Tpid = esPid;
++ SI::TeletextDescriptor *sd = (SI::TeletextDescriptor *)d;
++ SI::TeletextDescriptor::Teletext ttxt;
++ for (SI::Loop::Iterator it; sd->teletextLoop.getNext(ttxt, it); ) {
++ bool isSubtitlePage = (ttxt.getTeletextType() == 0x02) || (ttxt.getTeletextType() == 0x05);
++ if ((NumTPages < MAXTXTPAGES) && ttxt.languageCode[0] && isSubtitlePage) {
++ strn0cpy(TeletextSubtitlePages[NumTPages].ttxtLanguage, I18nNormalizeLanguageCode(ttxt.languageCode), MAXLANGCODE1);
++ TeletextSubtitlePages[NumTPages].ttxtPage = ttxt.getTeletextPageNumber();
++ TeletextSubtitlePages[NumTPages].ttxtMagazine = ttxt.getTeletextMagazineNumber();
++ TeletextSubtitlePages[NumTPages].ttxtType = ttxt.getTeletextType();
++ NumTPages++;
++ }
++ }
++ }
+ break;
+ case SI::ISO639LanguageDescriptorTag: {
+ SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d;
+@@ -541,6 +557,11 @@ void cPatFilter::Process(u_short Pid, u_
+ }
+ if (Setup.UpdateChannels >= 2) {
+ Channel->SetPids(Vpid, Ppid, Vtype, Apids, Atypes, ALangs, Dpids, Dtypes, DLangs, Spids, SLangs, Tpid);
++ if (NumTPages < MAXTXTPAGES) {
++ int manualPageNumber = cVDRTtxtsubsHookListener::Hook()->ManualPageNumber(Channel);
++ if (manualPageNumber)
++ TeletextSubtitlePages[NumTPages++] = tTeletextSubtitlePage(manualPageNumber);
++ }
+ if (!cSource::IsType(Channel->Source(), 'I'))
+ Channel->SetCaIds(CaDescriptors->CaIds());
+ Channel->SetSubtitlingDescriptors(SubtitlingTypes, CompositionPageIds, AncillaryPageIds);
diff --git a/multimedia/vdr/files/vdr-waitdvb.in b/multimedia/vdr/files/vdr-waitdvb.in
new file mode 100644
index 000000000000..da715bc52a4e
--- /dev/null
+++ b/multimedia/vdr/files/vdr-waitdvb.in
@@ -0,0 +1,40 @@
+#!/bin/sh
+#
+# $FreeBSD: /tmp/pcvs/ports/multimedia/vdr/files/vdr-waitdvb.in,v 1.1 2012-01-21 17:32:50 nox Exp $
+#
+
+command="%%PREFIX%%/bin/vdr"
+
+echo -n "vdr: waiting for dvb nodes: "
+i=0
+while true
+do
+ ndvb=$(ls /dev/dvb/adapter*/frontend* 2>/dev/null|wc -l|tr -d ' ')
+ if [ $ndvb -gt 0 ]; then
+ break
+ fi
+ if [ $i -ge 60 ]; then
+ break
+ fi
+ i=$((i + 1))
+ sleep 1
+ echo -n "."
+done
+
+i=0
+while true
+do
+ sleep 2
+ nndvb=$(ls /dev/dvb/adapter*/frontend* 2>/dev/null|wc -l|tr -d ' ')
+ echo -n " $nndvb"
+ if [ $nndvb -eq $ndvb ]; then
+ break
+ fi
+ if [ $i -ge 30 ]; then
+ break
+ fi
+ i=$((i + 1))
+done
+echo .
+
+exec "$command" "$@"
diff --git a/multimedia/vdr/files/vdr.in b/multimedia/vdr/files/vdr.in
index cf963cba649f..e2badf74435a 100644
--- a/multimedia/vdr/files/vdr.in
+++ b/multimedia/vdr/files/vdr.in
@@ -24,11 +24,23 @@
name=vdr
rcvar=vdr_enable
-command="%%PREFIX%%/bin/vdr"
-command_args="-d"
-
load_rc_config ${name}
: ${vdr_enable="NO"}
: ${vdr_chdir="%%VIDEODIR%%"}
+: ${vdr_waitdvb="YES"}
+
+command="%%PREFIX%%/bin/vdr"
+procname="$command"
+command_args="-d"
+
+start_precmd="${name}_prestart"
+
+vdr_prestart()
+{
+ if checkyesno "${name}_waitdvb"; then
+ command="/usr/sbin/daemon"
+ rc_flags="-f %%PREFIX%%/bin/vdr-waitdvb $rc_flags"
+ fi
+}
run_rc_command "$1"
diff --git a/multimedia/vdr/pkg-plist b/multimedia/vdr/pkg-plist
index 18f386f0000e..e1f34b025177 100644
--- a/multimedia/vdr/pkg-plist
+++ b/multimedia/vdr/pkg-plist
@@ -1,14 +1,16 @@
-bin/svdrpsend.pl
+bin/svdrpsend
bin/vdr
-lib/vdr/libvdr-dvbsddevice.so.1.7.19
-lib/vdr/libvdr-svcsvr.so.1.7.19
-lib/vdr/libvdr-svccli.so.1.7.19
-lib/vdr/libvdr-status.so.1.7.19
-lib/vdr/libvdr-skincurses.so.1.7.19
-lib/vdr/libvdr-pictures.so.1.7.19
-lib/vdr/libvdr-osddemo.so.1.7.19
-lib/vdr/libvdr-hello.so.1.7.19
-lib/vdr/libvdr-svdrpdemo.so.1.7.19
+bin/vdr-waitdvb
+lib/vdr/libvdr-dvbsddevice.so.1.7.22
+lib/vdr/libvdr-svcsvr.so.1.7.22
+lib/vdr/libvdr-svccli.so.1.7.22
+lib/vdr/libvdr-status.so.1.7.22
+lib/vdr/libvdr-skincurses.so.1.7.22
+lib/vdr/libvdr-pictures.so.1.7.22
+lib/vdr/libvdr-osddemo.so.1.7.22
+lib/vdr/libvdr-hello.so.1.7.22
+lib/vdr/libvdr-svdrpdemo.so.1.7.22
+libdata/pkgconfig/vdr.pc
%%NLS%%share/locale/ar/LC_MESSAGES/vdr.mo
%%NLS%%share/locale/es_ES/LC_MESSAGES/vdr.mo
%%NLS%%share/locale/es_ES/LC_MESSAGES/vdr-hello.mo
@@ -149,6 +151,9 @@ etc/vdr/diseqc.conf.sample
@unexec if cmp -s %D/etc/vdr/keymacros.conf.sample %D/etc/vdr/keymacros.conf; then rm -f %D/etc/vdr/keymacros.conf; fi
etc/vdr/keymacros.conf.sample
@exec if [ ! -f %D/etc/vdr/keymacros.conf ] ; then cp -p %D/%F %B/keymacros.conf; fi
+@unexec if cmp -s %D/etc/vdr/scr.conf.sample %D/etc/vdr/scr.conf; then rm -f %D/etc/vdr/scr.conf; fi
+etc/vdr/scr.conf.sample
+@exec if [ ! -f %D/etc/vdr/scr.conf ] ; then cp -p %D/%F %B/scr.conf; fi
@unexec if cmp -s %D/etc/vdr/sources.conf.sample %D/etc/vdr/sources.conf; then rm -f %D/etc/vdr/sources.conf; fi
etc/vdr/sources.conf.sample
@exec if [ ! -f %D/etc/vdr/sources.conf ] ; then cp -p %D/%F %B/sources.conf; fi