summaryrefslogtreecommitdiff
path: root/patches/patch-set/0003-Allow-manual-configuration-of-teletetxt-subtitle-pag.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/patch-set/0003-Allow-manual-configuration-of-teletetxt-subtitle-pag.patch')
-rw-r--r--patches/patch-set/0003-Allow-manual-configuration-of-teletetxt-subtitle-pag.patch137
1 files changed, 137 insertions, 0 deletions
diff --git a/patches/patch-set/0003-Allow-manual-configuration-of-teletetxt-subtitle-pag.patch b/patches/patch-set/0003-Allow-manual-configuration-of-teletetxt-subtitle-pag.patch
new file mode 100644
index 0000000..249185a
--- /dev/null
+++ b/patches/patch-set/0003-Allow-manual-configuration-of-teletetxt-subtitle-pag.patch
@@ -0,0 +1,137 @@
+From f33ffd78393792ba23c4ee48b3543e182663dc97 Mon Sep 17 00:00:00 2001
+From: etobi <git@e-tobi.net>
+Date: Fri, 12 Feb 2010 21:56:41 +0100
+Subject: [PATCH 3/5] Allow manual configuration of teletetxt subtitle pages in channels.conf
+
+---
+ channels.c | 49 +++++++++++++++++++++++++++++++++++++++++++++----
+ channels.h | 1 +
+ vdr.5 | 7 +++++++
+ 3 files changed, 53 insertions(+), 4 deletions(-)
+
+diff --git a/channels.c b/channels.c
+index 817b7d3..aaaea30 100644
+--- a/channels.c
++++ b/channels.c
+@@ -553,7 +553,7 @@ void cChannel::SetSubtitlingDescriptors(uchar *SubtitlingTypes, uint16_t *Compos
+
+ void cChannel::SetTeletextSubtitlePages(tTeletextSubtitlePage pages[])
+ {
+- for (int i = 0; i < MAXTXTPAGES; i++)
++ for (int i = fixedTeletextSubtitlePages; i < MAXTXTPAGES; i++)
+ teletextSubtitlePages[i] = pages[i];
+ teletextSubtitlePages[MAXTXTPAGES].ttxtType = 0;
+ }
+@@ -765,11 +765,22 @@ cString cChannel::ToText(const cChannel *Channel)
+ q += IntArrayToString(q, Channel->dpids, 10, Channel->dlangs);
+ }
+ *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->fixedTeletextSubtitlePages > 0) {
++ q += snprintf(q, sizeof(tpidbuf) - (q - tpidbuf), ";");
++ for (int i = 0; i < Channel->fixedTeletextSubtitlePages; ++i) {
++ tTeletextSubtitlePage page = Channel->teletextSubtitlePages[i];
++ q += snprintf(q, sizeof(tpidbuf) - (q - tpidbuf), "%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->ParametersToString(), *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->ParametersToString(), *cSource::ToString(Channel->source), Channel->srate, vpidbuf, apidbuf, tpidbuf, caidbuf, Channel->sid, Channel->nid, Channel->tid, Channel->rid);
+ }
+ return buffer;
+ }
+@@ -803,8 +814,9 @@ bool cChannel::Parse(const char *s)
+ char *parambuf = NULL;
+ char *vpidbuf = NULL;
+ char *apidbuf = NULL;
++ char *tpidbuf = NULL;
+ char *caidbuf = NULL;
+- 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);
+ if (fields >= 9) {
+ if (fields == 9) {
+ // allow reading of old format
+@@ -886,7 +898,35 @@ bool cChannel::Parse(const char *s)
+ }
+ dpids[NumDpids] = 0;
+ }
+-
++ if (tpidbuf) {
++ char *p;
++ fixedTeletextSubtitlePages = 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 (fixedTeletextSubtitlePages < MAXTXTPAGES) {
++ int page;
++ char *l = strchr(q, '=');
++ if (l)
++ *l++ = 0;
++ if (sscanf(q, "%d", &page) == 1) {
++ teletextSubtitlePages[fixedTeletextSubtitlePages++] = tTeletextSubtitlePage(page);
++ strn0cpy(teletextSubtitlePages[fixedTeletextSubtitlePages].ttxtLanguage, l ? l : "und", MAXLANGCODE1);
++ }
++ 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;
++ }
++ teletextSubtitlePages[fixedTeletextSubtitlePages].ttxtType = 0; // end of list
++ }
++ if (sscanf(tpidbuf, "%d", &tpid) != 1)
++ return false;
++ }
+ if (caidbuf) {
+ char *p = caidbuf;
+ char *q;
+@@ -923,6 +963,7 @@ bool cChannel::Parse(const char *s)
+ free(sourcebuf);
+ free(vpidbuf);
+ free(apidbuf);
++ free(tpidbuf);
+ free(caidbuf);
+ free(namebuf);
+ if (!GetChannelID().Valid()) {
+diff --git a/channels.h b/channels.h
+index 18ed7c6..1ddef40 100644
+--- a/channels.h
++++ b/channels.h
+@@ -144,6 +144,7 @@ private:
+ uint16_t compositionPageIds[MAXSPIDS];
+ uint16_t ancillaryPageIds[MAXSPIDS];
+ int tpid;
++ int fixedTeletextSubtitlePages;
+ tTeletextSubtitlePage teletextSubtitlePages[MAXTXTPAGES + 1]; // list is termintated by ttxtType=0
+ int caids[MAXCAIDS + 1]; // list is zero-terminated
+ int nid;
+diff --git a/vdr.5 b/vdr.5
+index 4b2cb90..c7da844 100644
+--- a/vdr.5
++++ b/vdr.5
+@@ -207,6 +207,13 @@ can be indicated by adding a second language code, delimited by a '+' sign, as i
+ .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
++
++.B ...:2001;150=deu,151=fin:...
++
+ .TP
+ .B Conditional access
+ A hexadecimal integer defining how this channel can be accessed:
+--
+1.6.5
+