diff --git a/HISTORY b/HISTORY index 922709ec..3d3da8b8 100644 --- a/HISTORY +++ b/HISTORY @@ -6226,3 +6226,4 @@ Video Disk Recorder Revision History If a channel's short name contains a comma, it is replaced with a '.'. - cDevice now logs the device number when a new device is created. - Fixed handling STREAMTYPE_11172_AUDIO in cPatPmtParser::ParsePmt(). +- cParsePatPmt now has functions to retrieve the audio, dolby and subtitle pids. diff --git a/remux.c b/remux.c index 168a3962..ec42e87d 100644 --- a/remux.c +++ b/remux.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: remux.c 2.34 2009/12/24 11:36:38 kls Exp $ + * $Id: remux.c 2.35 2009/12/24 12:24:02 kls Exp $ */ #include "remux.h" @@ -500,14 +500,15 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length) case 0x04: // STREAMTYPE_13818_AUDIO { if (NumApids < MAXAPIDS) { - char ALangs[MAXLANGCODE2] = ""; + apids[NumApids] = stream.getPid(); + *alangs[NumApids] = 0; SI::Descriptor *d; for (SI::Loop::Iterator it; (d = stream.streamDescriptors.getNext(it)); ) { switch (d->getDescriptorTag()) { case SI::ISO639LanguageDescriptorTag: { SI::ISO639LanguageDescriptor *ld = (SI::ISO639LanguageDescriptor *)d; SI::ISO639LanguageDescriptor::Language l; - char *s = ALangs; + char *s = alangs[NumApids]; int n = 0; for (SI::Loop::Iterator it; ld->languageLoop.getNext(l, it); ) { if (*ld->languageCode != '-') { // some use "---" to indicate "none" @@ -527,7 +528,7 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length) delete d; } if (updatePrimaryDevice) - cDevice::PrimaryDevice()->SetAvailableTrack(ttAudio, NumApids, stream.getPid(), ALangs); + cDevice::PrimaryDevice()->SetAvailableTrack(ttAudio, NumApids, apids[NumApids], alangs[NumApids]); NumApids++; } } @@ -546,14 +547,21 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length) case SI::SubtitlingDescriptorTag: dbgpatpmt(" subtitling"); if (NumSpids < MAXSPIDS) { + spids[NumSpids] = stream.getPid(); + *slangs[NumSpids] = 0; + subtitlingTypes[NumSpids] = 0; + compositionPageIds[NumSpids] = 0; + ancillaryPageIds[NumSpids] = 0; SI::SubtitlingDescriptor *sd = (SI::SubtitlingDescriptor *)d; SI::SubtitlingDescriptor::Subtitling sub; - char SLangs[MAXLANGCODE2] = ""; - char *s = SLangs; + char *s = slangs[NumSpids]; int n = 0; for (SI::Loop::Iterator it; sd->subtitlingLoop.getNext(sub, it); ) { if (sub.languageCode[0]) { dbgpatpmt(" '%s'", sub.languageCode); + subtitlingTypes[NumSpids] = sub.getSubtitlingType(); + compositionPageIds[NumSpids] = sub.getCompositionPageId(); + ancillaryPageIds[NumSpids] = sub.getAncillaryPageId(); if (n > 0) *s++ = '+'; strn0cpy(s, I18nNormalizeLanguageCode(sub.languageCode), MAXLANGCODE1); @@ -563,7 +571,7 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length) } } if (updatePrimaryDevice) - cDevice::PrimaryDevice()->SetAvailableTrack(ttSubtitle, NumSpids, stream.getPid(), SLangs); + cDevice::PrimaryDevice()->SetAvailableTrack(ttSubtitle, NumSpids, spids[NumSpids], slangs[NumSpids]); NumSpids++; } break; @@ -579,6 +587,8 @@ void cPatPmtParser::ParsePmt(const uchar *Data, int Length) } if (dpid) { if (NumDpids < MAXDPIDS) { + dpids[NumDpids] = dpid; + strn0cpy(dlangs[NumDpids], lang, sizeof(dlangs[NumDpids])); if (updatePrimaryDevice) cDevice::PrimaryDevice()->SetAvailableTrack(ttDolby, NumDpids, dpid, lang); NumDpids++; diff --git a/remux.h b/remux.h index e67f16a5..eee7d9ec 100644 --- a/remux.h +++ b/remux.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: remux.h 2.21 2009/12/04 15:04:43 kls Exp $ + * $Id: remux.h 2.22 2009/12/24 12:04:47 kls Exp $ */ #ifndef __REMUX_H @@ -214,6 +214,15 @@ private: int pmtPid; int vpid; int vtype; + int apids[MAXAPIDS + 1]; // list is zero-terminated + char alangs[MAXAPIDS][MAXLANGCODE2]; + int dpids[MAXDPIDS + 1]; // list is zero-terminated + char dlangs[MAXDPIDS][MAXLANGCODE2]; + int spids[MAXSPIDS + 1]; // list is zero-terminated + char slangs[MAXSPIDS][MAXLANGCODE2]; + uchar subtitlingTypes[MAXSPIDS]; + uint16_t compositionPageIds[MAXSPIDS]; + uint16_t ancillaryPageIds[MAXSPIDS]; bool updatePrimaryDevice; protected: int SectionLength(const uchar *Data, int Length) { return (Length >= 3) ? ((int(Data[1]) & 0x0F) << 8)| Data[2] : 0; } @@ -244,6 +253,18 @@ 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. + const int *Apids(void) const { return apids; } + const int *Dpids(void) const { return dpids; } + const int *Spids(void) const { return spids; } + int Apid(int i) const { return (0 <= i && i < MAXAPIDS) ? apids[i] : 0; } + int Dpid(int i) const { return (0 <= i && i < MAXDPIDS) ? dpids[i] : 0; } + int Spid(int i) const { return (0 <= i && i < MAXSPIDS) ? spids[i] : 0; } + const char *Alang(int i) const { return (0 <= i && i < MAXAPIDS) ? alangs[i] : ""; } + const char *Dlang(int i) const { return (0 <= i && i < MAXDPIDS) ? dlangs[i] : ""; } + const char *Slang(int i) const { return (0 <= i && i < MAXSPIDS) ? slangs[i] : ""; } + 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); } }; // TS to PES converter: