diff options
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.patch | 137 |
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, ¶mbuf, &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, ¶mbuf, &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 + |