summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoretobi <git@e-tobi.net>2010-02-12 22:06:19 +0100
committeretobi <git@e-tobi.net>2011-10-01 23:52:36 +0200
commit9960c81bed0689a397f8a3b9e3de91a3f75e5237 (patch)
treeeca2f438207044d94d227d8b21346d6bb49071fc
parente2833f1f09f24154b664e956ae31bcae6d101ce9 (diff)
downloadvdr-patches-9960c81bed0689a397f8a3b9e3de91a3f75e5237.tar.gz
vdr-patches-9960c81bed0689a397f8a3b9e3de91a3f75e5237.tar.bz2
Capture teletext subtitle pages from PMT
-rw-r--r--remux.c24
-rw-r--r--remux.h5
2 files changed, 29 insertions, 0 deletions
diff --git a/remux.c b/remux.c
index adec265..4f9950f 100644
--- a/remux.c
+++ b/remux.c
@@ -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);
diff --git a/remux.h b/remux.h
index 80d6afd..5f15dfe 100644
--- a/remux.h
+++ b/remux.h
@@ -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: