16 #define PMT_SCAN_TIMEOUT 1000 // ms 49 data[4] = ((CaPid >> 8) & 0x1F) | 0xE0;
50 data[5] = CaPid & 0xFF;
52 memcpy(&
data[6], Data, Length);
76 void AddCaId(
int CaId);
78 cCaDescriptors(
int Source,
int Transponder,
int ServiceId,
int PmtPid);
80 bool Is(
int Source,
int Transponder,
int ServiceId);
85 int GetCaPids(
const int *CaSystemIds,
int BufSize,
int *Pids);
87 const int *
CaIds(
void) {
return caIds; }
93 transponder = Transponder;
94 serviceId = ServiceId;
107 ca1 = caDescriptors.
Next(ca1);
115 return source == Source && transponder == Transponder && serviceId == ServiceId;
126 for (
int i = 0; i < numCaIds; i++) {
127 if (caIds[i] == CaId)
130 caIds[numCaIds++] = CaId;
138 for (
cCaDescriptor *ca = caDescriptors.First(); ca; ca = caDescriptors.
Next(ca)) {
145 caDescriptors.Add(nca);
147 #ifdef DEBUG_CA_DESCRIPTORS 150 q += sprintf(q,
"CAM: %04X %5d %5d %04X %04X -", source, transponder, serviceId, d->
getCaType(),
EsPid);
151 for (
int i = 0; i < nca->
Length(); i++)
152 q += sprintf(q,
" %02X", nca->
Data()[i]);
164 if (!CaSystemIds || !*CaSystemIds)
166 if (BufSize > 0 && Data) {
170 const int *caids = CaSystemIds;
172 if (*caids == 0xFFFF || d->CaSystem() == *caids) {
173 if (length + d->Length() <= BufSize) {
174 memcpy(Data + length, d->Data(), d->Length());
175 length += d->Length();
190 if (!CaSystemIds || !*CaSystemIds)
192 if (BufSize > 0 && Pids) {
195 const int *caids = CaSystemIds;
197 if (*caids == 0xFFFF || d->CaSystem() == *caids) {
198 if (numPids + 1 < BufSize) {
199 Pids[numPids++] = d->CaPid();
223 int GetCaPids(
int Source,
int Transponder,
int ServiceId,
const int *CaSystemIds,
int BufSize,
int *Pids);
224 int GetPmtPid(
int Source,
int Transponder,
int ServiceId);
231 if (ca->Is(CaDescriptors)) {
232 if (*ca == *CaDescriptors) {
233 delete CaDescriptors;
242 return CaDescriptors->
Empty() ? 0 : 1;
249 if (ca->Is(Source, Transponder, ServiceId))
250 return ca->GetCaDescriptors(CaSystemIds, BufSize, Data, EsPid);
259 if (ca->Is(Source, Transponder, ServiceId))
260 return ca->GetCaPids(CaSystemIds, BufSize, Pids);
269 if (ca->Is(Source, Transponder, ServiceId))
270 return ca->GetPmtPid();
279 return CaDescriptorHandler.
GetCaDescriptors(Source, Transponder, ServiceId, CaSystemIds, BufSize, Data, EsPid);
282 int GetCaPids(
int Source,
int Transponder,
int ServiceId,
const int *CaSystemIds,
int BufSize,
int *Pids)
284 return CaDescriptorHandler.
GetCaPids(Source, Transponder, ServiceId, CaSystemIds, BufSize, Pids);
287 int GetPmtPid(
int Source,
int Transponder,
int ServiceId)
289 return CaDescriptorHandler.
GetPmtPid(Source, Transponder, ServiceId);
296 #define DBGLOG(a...) { cString s = cString::sprintf(a); fprintf(stderr, "%s\n", *s); dsyslog("%s", *s); } 310 DBGLOG(
"PAT filter set status %d", On);
323 DBGLOG(
"PAT filter trigger SID %d", Sid);
329 int Id = MakePmtId(PmtPid, Sid);
330 for (
int i = 0; i < numPmtEntries; i++) {
331 if (pmtId[i] == Id) {
332 if (pmtVersion[i] != Version) {
334 pmtVersion[i] = Version;
336 DBGLOG(
"PMT %d %2d %5d %2d -> %2d", Transponder(), i, PmtPid, pmtVersion[i], Version);
349 pmtIndex = (pmtIndex + 1) % numPmtEntries;
374 pmtVersion[numPmtEntries] = -1;
376 pmtIndex = numPmtEntries;
377 DBGLOG(
"sid = %d pmtIndex = %d", sid, pmtIndex);
382 if (numPmtEntries > 0 && pmtIndex < 0)
396 SwitchToNextPmtPid();
402 SwitchToNextPmtPid();
423 uint16_t CompositionPageIds[
MAXSPIDS + 1] = { 0 };
424 uint16_t AncillaryPageIds[
MAXSPIDS + 1] = { 0 };
433 bool ProcessCaDescriptors =
false;
442 ProcessCaDescriptors =
true;
450 Apids[NumApids] =
esPid;
458 char *s = ALangs[NumApids];
478 ProcessCaDescriptors =
true;
495 ProcessCaDescriptors =
true;
499 Spids[NumSpids] =
esPid;
502 char *s = SLangs[NumSpids];
534 Dpids[NumDpids] = dpid;
535 Dtypes[NumDpids] = dtype;
547 ProcessCaDescriptors =
true;
567 Dpids[NumDpids] =
esPid;
572 ProcessCaDescriptors =
true;
613 Dpids[NumDpids] =
esPid;
618 ProcessCaDescriptors =
true;
624 if (ProcessCaDescriptors) {
632 Channel->
SetPids(Vpid, Ppid, Vtype, Apids, Atypes, ALangs, Dpids, Dtypes, DLangs, Spids, SLangs, Tpid);
640 if (timer.TimedOut()) {
642 DBGLOG(
"PMT timeout %d", pmtIndex);
643 SwitchToNextPmtPid();
#define STANDARD_ANSISCTE
virtual void Process(u_short Pid, u_char Tid, const u_char *Data, int Length)
Processes the data delivered to this filter.
int getCompositionPageId() const
StructureLoop< Association > associationLoop
StructureLoop< Stream > streamLoop
DescriptorLoop commonDescriptors
DescriptorTag getDescriptorTag() const
StructureLoop< Subtitling > subtitlingLoop
int GetCaDescriptors(const int *CaSystemIds, int BufSize, uchar *Data, int EsPid)
void AddCaDescriptor(SI::CaDescriptor *d, int EsPid)
int Transponder(void) const
Returns the transponder frequency in MHz, plus the polarization in case of sat.
int GetPmtPid(int Source, int Transponder, int ServiceId)
cCaDescriptors(int Source, int Transponder, int ServiceId, int PmtPid)
int GetCaPids(int Source, int Transponder, int ServiceId, const int *CaSystemIds, int BufSize, int *Pids)
T * Next(const T *object) const
cListObject * Next(void) const
int getTableIdExtension() const
bool Is(int Source, int Transponder, int ServiceId)
int getFormatIdentifier() const
int GetCaDescriptors(int Source, int Transponder, int ServiceId, const int *CaSystemIds, int BufSize, uchar *Data, int EsPid)
Gets all CA descriptors for a given channel.
void SwitchToNextPmtPid(void)
void SetCaDescriptors(int Level)
int GetPmtPid(int Source, int Transponder, int ServiceId)
Gets the Pid of the PMT in which the CA descriptors for this channel are defined. ...
bool Lock(bool Write, int TimeoutMs=0)
int getSubtitlingType() const
StructureLoop< Language > languageLoop
int GetCaPids(const int *CaSystemIds, int BufSize, int *Pids)
cChannel * GetByServiceID(int Source, int Transponder, unsigned short ServiceID)
int AddCaDescriptors(cCaDescriptors *CaDescriptors)
void SetSubtitlingDescriptors(uchar *SubtitlingTypes, uint16_t *CompositionPageIds, uint16_t *AncillaryPageIds)
const int GetPmtPid(void)
int getStreamType() const
virtual void SetStatus(bool On)
Turns this filter on or off, depending on the value of On.
int GetCaDescriptors(int Source, int Transponder, int ServiceId, const int *CaSystemIds, int BufSize, uchar *Data, int EsPid)
virtual void SetStatus(bool On)
Turns this filter on or off, depending on the value of On.
cList< cCaDescriptor > caDescriptors
int getVersionNumber() const
bool operator==(const cCaDescriptors &arg) const
DescriptorLoop streamDescriptors
int GetCaPids(int Source, int Transponder, int ServiceId, const int *CaSystemIds, int BufSize, int *Pids)
Gets all CA pids for a given channel.
const uchar * Data(void) const
cCaDescriptor(int CaSystem, int CaPid, int EsPid, int Length, const uchar *Data)
int getAncillaryPageId() const
bool PmtVersionChanged(int PmtPid, int Sid, int Version, bool SetNewVersion=false)
void SetPids(int Vpid, int Ppid, int Vtype, int *Apids, int *Atypes, char ALangs[][MAXLANGCODE2], int *Dpids, int *Dtypes, char DLangs[][MAXLANGCODE2], int *Spids, char SLangs[][MAXLANGCODE2], int Tpid)
bool operator==(const cCaDescriptor &arg) const
const char * I18nNormalizeLanguageCode(const char *Code)
Returns a 3 letter language code that may not be zero terminated.
const unsigned char * getData() const
void SetCaIds(const int *CaIds)
Descriptor * getNext(Iterator &it)
cCaDescriptorHandler CaDescriptorHandler