summaryrefslogtreecommitdiff
path: root/patches/patch-set/0005-Capture-teletext-subtitle-pages-from-PMT.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/patch-set/0005-Capture-teletext-subtitle-pages-from-PMT.patch')
-rw-r--r--patches/patch-set/0005-Capture-teletext-subtitle-pages-from-PMT.patch104
1 files changed, 104 insertions, 0 deletions
diff --git a/patches/patch-set/0005-Capture-teletext-subtitle-pages-from-PMT.patch b/patches/patch-set/0005-Capture-teletext-subtitle-pages-from-PMT.patch
new file mode 100644
index 0000000..91b57c3
--- /dev/null
+++ b/patches/patch-set/0005-Capture-teletext-subtitle-pages-from-PMT.patch
@@ -0,0 +1,104 @@
+From cd69cfb12c691834710beb346527920b8802552e Mon Sep 17 00:00:00 2001
+From: etobi <git@e-tobi.net>
+Date: Fri, 12 Feb 2010 22:06:19 +0100
+Subject: [PATCH 5/6] Capture teletext subtitle pages from PMT
+
+---
+ remux.c | 26 ++++++++++++++++++++++++++
+ remux.h | 6 ++++++
+ 2 files changed, 32 insertions(+), 0 deletions(-)
+
+diff --git a/remux.c b/remux.c
+index 869b6e4..24fcbd3 100644
+--- a/remux.c
++++ b/remux.c
+@@ -431,6 +431,7 @@ void cPatPmtParser::Reset(void)
+ pmtPid = -1;
+ vpid = vtype = 0;
+ ppid = 0;
++ tpid = 0;
+ }
+
+ void cPatPmtParser::ParsePat(const uchar *Data, int Length)
+@@ -514,8 +515,10 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
+ int NumApids = 0;
+ int NumDpids = 0;
+ int NumSpids = 0;
++ int NumTPages = 0;
+ vpid = vtype = 0;
+ ppid = 0;
++ tpid = 0;
+ apids[0] = 0;
+ dpids[0] = 0;
+ spids[0] = 0;
+@@ -614,6 +617,29 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length)
+ spids[NumSpids]= 0;
+ }
+ break;
++ case SI::TeletextDescriptorTag: {
++ dbgpatpmt(" teletext");
++ tpid = stream.getPid();
++ SI::TeletextDescriptor *sd = (SI::TeletextDescriptor *)d;
++ SI::TeletextDescriptor::Teletext ttxt;
++ if (NumTPages < MAXTXTPAGES) {
++ for (SI::Loop::Iterator it; sd->teletextLoop.getNext(ttxt, it); ) {
++ bool isSubtitlePage = (ttxt.getTeletextType() == 0x02) || (ttxt.getTeletextType() == 0x05);
++ if (isSubtitlePage && ttxt.languageCode[0]) {
++ dbgpatpmt(" '%s:%x.%x'", ttxt.languageCode, ttxt.getTeletextMagazineNumber(), ttxt.getTeletextPageNumber());
++ strn0cpy(teletextSubtitlePages[NumTPages].ttxtLanguage, I18nNormalizeLanguageCode(ttxt.languageCode), MAXLANGCODE1);
++ teletextSubtitlePages[NumTPages].ttxtPage = ttxt.getTeletextPageNumber();
++ teletextSubtitlePages[NumTPages].ttxtMagazine = ttxt.getTeletextMagazineNumber();
++ teletextSubtitlePages[NumTPages].ttxtType = ttxt.getTeletextType();
++ NumTPages++;
++ if (NumTPages >= MAXTXTPAGES)
++ break;
++ }
++ }
++ teletextSubtitlePages[NumTPages].ttxtType = 0; // indicates end of list
++ }
++ }
++ break;
+ case SI::ISO639LanguageDescriptorTag: {
+ SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d;
+ dbgpatpmt(" '%s'", ld->languageCode);
+diff --git a/remux.h b/remux.h
+index cef50d7..43809fc 100644
+--- a/remux.h
++++ b/remux.h
+@@ -216,6 +216,7 @@ private:
+ int vpid;
+ int ppid;
+ int vtype;
++ int tpid;
+ int apids[MAXAPIDS + 1]; // list is zero-terminated
+ int atypes[MAXAPIDS + 1]; // list is zero-terminated
+ char alangs[MAXAPIDS][MAXLANGCODE2];
+@@ -228,6 +229,7 @@ private:
+ uint16_t compositionPageIds[MAXSPIDS];
+ uint16_t ancillaryPageIds[MAXSPIDS];
+ bool updatePrimaryDevice;
++ tTeletextSubtitlePage teletextSubtitlePages[MAXTXTPAGES + 1]; // list is zero-terminated
+ protected:
+ int SectionLength(const uchar *Data, int Length) { return (Length >= 3) ? ((int(Data[1]) & 0x0F) << 8)| Data[2] : 0; }
+ public:
+@@ -260,6 +262,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.
++ int Tpid(void) { return tpid; }
++ ///< Returns the teletext pid as defined by the current PMT, or 0 if no teletext
++ ///< pid has been detected, yet.
+ const int *Apids(void) const { return apids; }
+ const int *Dpids(void) const { return dpids; }
+ const int *Spids(void) const { return spids; }
+@@ -274,6 +279,7 @@ 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); }
++ const tTeletextSubtitlePage* TeletextSubtitlePages() const { return teletextSubtitlePages; }
+ };
+
+ // TS to PES converter:
+--
+1.6.5
+