diff options
author | etobi <git@e-tobi.net> | 2010-02-12 22:06:19 +0100 |
---|---|---|
committer | etobi <git@e-tobi.net> | 2011-10-01 23:52:36 +0200 |
commit | 9960c81bed0689a397f8a3b9e3de91a3f75e5237 (patch) | |
tree | eca2f438207044d94d227d8b21346d6bb49071fc | |
parent | e2833f1f09f24154b664e956ae31bcae6d101ce9 (diff) | |
download | vdr-patches-9960c81bed0689a397f8a3b9e3de91a3f75e5237.tar.gz vdr-patches-9960c81bed0689a397f8a3b9e3de91a3f75e5237.tar.bz2 |
Capture teletext subtitle pages from PMT
-rw-r--r-- | remux.c | 24 | ||||
-rw-r--r-- | remux.h | 5 |
2 files changed, 29 insertions, 0 deletions
@@ -439,6 +439,7 @@ void cPatPmtParser::Reset(void) pmtPid = -1; vpid = vtype = 0; ppid = 0; + tpid = 0; } void cPatPmtParser::ParsePat(const uchar *Data, int Length) @@ -524,6 +525,7 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length) int NumSpids = 0; vpid = vtype = 0; ppid = 0; + tpid = 0; apids[0] = 0; dpids[0] = 0; spids[0] = 0; @@ -628,6 +630,28 @@ 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 (totalTtxtSubtitlePages < 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[totalTtxtSubtitlePages].ttxtLanguage, I18nNormalizeLanguageCode(ttxt.languageCode), MAXLANGCODE1); + teletextSubtitlePages[totalTtxtSubtitlePages].ttxtPage = ttxt.getTeletextPageNumber(); + teletextSubtitlePages[totalTtxtSubtitlePages].ttxtMagazine = ttxt.getTeletextMagazineNumber(); + teletextSubtitlePages[totalTtxtSubtitlePages].ttxtType = ttxt.getTeletextType(); + totalTtxtSubtitlePages++; + if (totalTtxtSubtitlePages >= MAXTXTPAGES) + break; + } + } + } + } + break; case SI::ISO639LanguageDescriptorTag: { SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d; dbgpatpmt(" '%s'", ld->languageCode); @@ -220,6 +220,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]; @@ -266,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. + 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; } @@ -280,6 +284,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: |