aboutsummaryrefslogtreecommitdiffstats
path: root/multimedia/vdr
diff options
context:
space:
mode:
Diffstat (limited to 'multimedia/vdr')
-rw-r--r--multimedia/vdr/Makefile16
-rw-r--r--multimedia/vdr/Makefile.plugins8
-rw-r--r--multimedia/vdr/distinfo4
-rw-r--r--multimedia/vdr/files/patch-clang11
-rw-r--r--multimedia/vdr/files/patch-receiver.c15
-rw-r--r--multimedia/vdr/files/vdr-1.7.15-ttxtsubs.patch-123
-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/pkg-plist18
9 files changed, 433 insertions, 39 deletions
diff --git a/multimedia/vdr/Makefile b/multimedia/vdr/Makefile
index 5e08686308b8..599a46ed7d28 100644
--- a/multimedia/vdr/Makefile
+++ b/multimedia/vdr/Makefile
@@ -6,8 +6,7 @@
#
PORTNAME= vdr
-PORTVERSION= 1.7.18
-PORTREVISION= 3
+PORTVERSION= 1.7.19
CATEGORIES= multimedia
MASTER_SITES= ftp://ftp.tvdr.de/vdr/Developer/
@@ -32,8 +31,10 @@ MAKE_JOBS_SAFE= yes
MAN1= vdr.1
MAN5= vdr.5
MANCOMPRESSED= yes
-MAKE_JOBS_SAFE= yes
CONFDIR= $(ETCDIR)
+USE_CSTD= gnu89
+MAKE_ARGS+= CC=${CC}
+MAKE_ARGS+= CXX=${CXX}
MAKE_ARGS+= DVBDIR=${LOCALBASE}/include
MAKE_ARGS+= VDR_USER=${VDR_USER}
MAKE_ARGS+= CONFDIR=$(CONFDIR)
@@ -72,9 +73,18 @@ 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
.endif
@${SED} 's|^\(VIDEODIR[[:space:]]*\)[?]*\(=[[:space:]]*\).*|\1\2${VIDEODIR}|' \
${WRKSRC}/Make.config.template >${WRKSRC}/Make.config
diff --git a/multimedia/vdr/Makefile.plugins b/multimedia/vdr/Makefile.plugins
index d16bf05e33a8..50ce7bc76f6b 100644
--- a/multimedia/vdr/Makefile.plugins
+++ b/multimedia/vdr/Makefile.plugins
@@ -1,6 +1,6 @@
# this is to be included by vdr plugin ports
#
-# $FreeBSD: /tmp/pcvs/ports/multimedia/vdr/Makefile.plugins,v 1.1 2011-03-26 19:13:49 nox Exp $
+# $FreeBSD: /tmp/pcvs/ports/multimedia/vdr/Makefile.plugins,v 1.2 2011-06-25 19:02:04 nox Exp $
BUILD_DEPENDS+= ${LOCALBASE}/include/linux/dvb/frontend.h:${PORTSDIR}/multimedia/v4l_compat
@@ -13,6 +13,9 @@ USE_GMAKE= yes
USE_GETTEXT= yes
VDRDIR= ${LOCALBASE}/include/vdr
VDRINCDIR= ${LOCALBASE}/include
+USE_CSTD?= gnu89
+MAKE_ARGS+= CC=${CC}
+MAKE_ARGS+= CXX=${CXX}
MAKE_ARGS+= DVBDIR=${LOCALBASE}/include
MAKE_ARGS+= VDRDIR=${VDRDIR}
MAKE_ARGS+= VDR_USER=${VDR_USER}
@@ -41,7 +44,8 @@ post-patch-plugin:
's/^\(LOCALEDIR[[:space:]]*\)[?]*\(=[[:space:]]*\).*/\1\2..\/locale/;'\\
's/^\(VDRDIR[[:space:]]*\)[?]*\(=[[:space:]]*\).*/\1\2'"${VDRDIR:S-/-\\\\/-g}/;"\\
's/^\(VDRINCDIR[[:space:]]*\)[?]*\(=[[:space:]]*\).*/\1\2'"${VDRINCDIR:S-/-\\\\/-g}/;"\\
- 's/^\(BINDIR[[:space:]]*\)[?]*\(=[[:space:]]*\).*/\1\2'"${PREFIX:S-/-\\\\/-g}\/bin/;" \
+ 's/^\(BINDIR[[:space:]]*\)[?]*\(=[[:space:]]*\).*/\1\2'"${PREFIX:S-/-\\\\/-g}\/bin/;"\\
+ '/^MAKEDEP.*-MM/s/-MG[[:space:]]*$$/# -MG/' \
${WRKSRC}/Makefile ${VDR_PLUGIN_MAKEFILES}
post-install-pluginlocales:
diff --git a/multimedia/vdr/distinfo b/multimedia/vdr/distinfo
index 7a5a420d8c52..0033b061d918 100644
--- a/multimedia/vdr/distinfo
+++ b/multimedia/vdr/distinfo
@@ -1,2 +1,2 @@
-SHA256 (vdr/vdr-1.7.18.tar.bz2) = 503168921cbcae21687fc4d686c56c2f0b1cbdc578fb053b4a18eee8e5002705
-SIZE (vdr/vdr-1.7.18.tar.bz2) = 712601
+SHA256 (vdr/vdr-1.7.19.tar.bz2) = 25481ac1fdc01fbed4e8bde6436346bb919c966aff4da0d67b5cc13318e6039e
+SIZE (vdr/vdr-1.7.19.tar.bz2) = 717625
diff --git a/multimedia/vdr/files/patch-clang b/multimedia/vdr/files/patch-clang
new file mode 100644
index 000000000000..1691aedbdcd6
--- /dev/null
+++ b/multimedia/vdr/files/patch-clang
@@ -0,0 +1,11 @@
+--- config.h.orig
++++ config.h
+@@ -103,7 +103,7 @@ public:
+ if (!isempty(s)) {
+ T *l = new T;
+ if (l->Parse(s))
+- Add(l);
++ this->Add(l);
+ else {
+ esyslog("ERROR: error in %s, line %d", fileName, line);
+ delete l;
diff --git a/multimedia/vdr/files/patch-receiver.c b/multimedia/vdr/files/patch-receiver.c
new file mode 100644
index 000000000000..c37c79d10f67
--- /dev/null
+++ b/multimedia/vdr/files/patch-receiver.c
@@ -0,0 +1,15 @@
+--- receiver.c.orig
++++ receiver.c
+@@ -36,10 +36,10 @@ cReceiver::cReceiver(const cChannel *Cha
+ cReceiver::~cReceiver()
+ {
+ if (device) {
+- const char *msg = "ERROR: cReceiver has not been detached yet! This is a design fault and VDR will segfault now!";
++ const char *msg = "ERROR: cReceiver has not been detached yet! This is a design fault and VDR will abort now!";
+ esyslog("%s", msg);
+ fprintf(stderr, "%s\n", msg);
+- *(char *)0 = 0; // cause a segfault
++ abort();
+ }
+ }
+
diff --git a/multimedia/vdr/files/vdr-1.7.15-ttxtsubs.patch-1 b/multimedia/vdr/files/vdr-1.7.15-ttxtsubs.patch-1
index acd3b283d8f8..45e8def1bd8e 100644
--- a/multimedia/vdr/files/vdr-1.7.15-ttxtsubs.patch-1
+++ b/multimedia/vdr/files/vdr-1.7.15-ttxtsubs.patch-1
@@ -81,29 +81,6 @@ 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 6c7b031..22fda9f 100644
---- a/ci.c
-+++ b/ci.c
-@@ -1911,6 +1911,8 @@ void cCamSlot::AddChannel(const cChannel *Channel)
- AddPid(Channel->Sid(), *Apid, STREAM_TYPE_AUDIO);
- for (const int *Dpid = Channel->Dpids(); *Dpid; Dpid++)
- AddPid(Channel->Sid(), *Dpid, STREAM_TYPE_DOLBY);
-+ if (Channel->Tpid() && Setup.SupportTeletext)
-+ AddPid(Channel->Sid(), Channel->Tpid(), STREAM_TYPE_DOLBY);
- }
- }
-
-@@ -1932,6 +1934,9 @@ bool cCamSlot::CanDecrypt(const cChannel *Channel)
- CaPmt.AddPid(*Apid, STREAM_TYPE_AUDIO);
- for (const int *Dpid = Channel->Dpids(); *Dpid; Dpid++)
- CaPmt.AddPid(*Dpid, STREAM_TYPE_DOLBY);
-+ if (Channel->Tpid() && Setup.SupportTeletext) {
-+ CaPmt.AddPid(Channel->Tpid(), STREAM_TYPE_DOLBY); // FIXME: STREAM_TYPE_DOLBY should probably be renamed STREAM_TYPE_PRIVATE
-+ }
- cas->SendPMT(&CaPmt);
- cTimeMs Timeout(QUERY_REPLY_TIMEOUT);
- do {
diff --git a/config.c b/config.c
index 73b11b1..f2eebe6 100644
--- a/config.c
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
new file mode 100644
index 000000000000..a58f4d879995
--- /dev/null
+++ b/multimedia/vdr/files/vdr-1.7.18-1.7.19-tspacketbug.diff
@@ -0,0 +1,356 @@
+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
new file mode 100644
index 000000000000..4f5f1bb830df
--- /dev/null
+++ b/multimedia/vdr/files/vdr-1.7.19-ttxtsubs.patch-3
@@ -0,0 +1,21 @@
+--- 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/pkg-plist b/multimedia/vdr/pkg-plist
index abcd9493d40a..18f386f0000e 100644
--- a/multimedia/vdr/pkg-plist
+++ b/multimedia/vdr/pkg-plist
@@ -1,14 +1,14 @@
bin/svdrpsend.pl
bin/vdr
-lib/vdr/libvdr-dvbsddevice.so.1.7.18
-lib/vdr/libvdr-svcsvr.so.1.7.18
-lib/vdr/libvdr-svccli.so.1.7.18
-lib/vdr/libvdr-status.so.1.7.18
-lib/vdr/libvdr-skincurses.so.1.7.18
-lib/vdr/libvdr-pictures.so.1.7.18
-lib/vdr/libvdr-osddemo.so.1.7.18
-lib/vdr/libvdr-hello.so.1.7.18
-lib/vdr/libvdr-svdrpdemo.so.1.7.18
+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
%%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