summaryrefslogtreecommitdiff
path: root/eit.c
diff options
context:
space:
mode:
authorKlaus Schmidinger <kls (at) cadsoft (dot) de>2003-04-21 18:00:00 +0200
committerKlaus Schmidinger <kls (at) cadsoft (dot) de>2003-04-21 18:00:00 +0200
commit21a52ccb6d43cce35f7a381f55ea291195416f33 (patch)
treebc7d86214e695434ca7170bff799bcc4aaca5401 /eit.c
parent9f919801465f49be6b2118f54bd54df846e2f865 (diff)
downloadvdr-patch-lnbsharing-21a52ccb6d43cce35f7a381f55ea291195416f33.tar.gz
vdr-patch-lnbsharing-21a52ccb6d43cce35f7a381f55ea291195416f33.tar.bz2
Version 1.1.28vdr-1.1.28
- Using masks in EIT filtering to reduce the number of filters (thanks to Andreas Schultz). - Fixed handling Ca descriptors (thanks to Stefan Huelswitt). - Now only those Ca descriptors are sent to a CAM that are actually understood by that CAM. - Re-enabled CAM communication during replay and on non-Ca channels. This requires a DVB driver with firmware version 2613 or later. - It is now possible to do simultaneous recording and replay with a single DVB card, even with encrypted channels. This requires the use of the Link Layer firmware, version 2613 or higher; the -icam firmware is still limited to live encrypted channels only. Finally we have time shift for encrypted channels on single card systems! - Enhanced detection of pending user I/O from CAMs to avoid sluggish reaction to remote control keypresses. - Implemented "pause live video". You can now press "Menu/Yellow" or "Pause" on your remote control while watching live video to start an instant recording of the current programme and immediately start replaying that recording.
Diffstat (limited to 'eit.c')
-rw-r--r--eit.c91
1 files changed, 37 insertions, 54 deletions
diff --git a/eit.c b/eit.c
index ff5dd42..2bab1a5 100644
--- a/eit.c
+++ b/eit.c
@@ -16,7 +16,7 @@
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
- * $Id: eit.c 1.68 2003/04/12 11:27:31 kls Exp $
+ * $Id: eit.c 1.72 2003/04/21 13:21:54 kls Exp $
***************************************************************************/
#include "eit.h"
@@ -1002,34 +1002,38 @@ bool cEIT::IsPresentFollowing()
// --- cCaDescriptor ---------------------------------------------------------
class cCaDescriptor : public cListObject {
- friend class cCaDescriptors;
+ friend class cSIProcessor;
private:
int source;
int transponder;
int serviceId;
int caSystem;
+ unsigned int providerId;
+ int caPid;
int length;
uchar *data;
public:
- cCaDescriptor(int Source, int Transponder, int ServiceId, int CaSystem, int CaPid, int Length, uchar *Data);
+ cCaDescriptor(int Source, int Transponder, int ServiceId, int CaSystem, unsigned int ProviderId, int CaPid, int Length, uchar *Data);
virtual ~cCaDescriptor();
int Length(void) const { return length; }
const uchar *Data(void) const { return data; }
};
-cCaDescriptor::cCaDescriptor(int Source, int Transponder, int ServiceId, int CaSystem, int CaPid, int Length, uchar *Data)
+cCaDescriptor::cCaDescriptor(int Source, int Transponder, int ServiceId, int CaSystem, unsigned int ProviderId, int CaPid, int Length, uchar *Data)
{
source = Source;
transponder = Transponder;
serviceId = ServiceId;
caSystem = CaSystem;
+ providerId = ProviderId;
+ caPid = CaPid;
length = Length + 6;
data = MALLOC(uchar, length);
data[0] = DESCR_CA;
data[1] = length - 2;
data[2] = (caSystem >> 8) & 0xFF;
data[3] = caSystem & 0xFF;
- data[4] = ((CaPid >> 8) & 0xFF) | 0xE0;
+ data[4] = ((CaPid >> 8) & 0x1F) | 0xE0;
data[5] = CaPid & 0xFF;
if (Length)
memcpy(&data[6], Data, Length);
@@ -1037,7 +1041,7 @@ cCaDescriptor::cCaDescriptor(int Source, int Transponder, int ServiceId, int CaS
#ifdef DEBUG_CA_DESCRIPTORS
char buffer[1024];
char *q = buffer;
- q += sprintf(q, "CAM: %04X %5d %4d", source, transponder, serviceId);
+ q += sprintf(q, "CAM: %04X %5d %5d %04X %6X %04X -", source, transponder, serviceId, caSystem, providerId, caPid);
for (int i = 0; i < length; i++)
q += sprintf(q, " %02X", data[i]);
dsyslog(buffer);
@@ -1049,26 +1053,6 @@ cCaDescriptor::~cCaDescriptor()
free(data);
}
-// --- cCaDescriptors --------------------------------------------------------
-
-class cCaDescriptors : public cList<cCaDescriptor> {
-public:
- const cCaDescriptor *Get(int Source, int Transponder, int ServiceId, int CaSystem);
- };
-
-const cCaDescriptor *cCaDescriptors::Get(int Source, int Transponder, int ServiceId, int CaSystem)
-{
- for (cCaDescriptor *ca = First(); ca; ca = Next(ca)) {
- if (ca->source == Source && ca->transponder == Transponder && ca->serviceId == ServiceId) {
- if (CaSystem == -1 || ca->caSystem == CaSystem)
- return ca;
- if (CaSystem < 0)
- CaSystem++;
- }
- }
- return NULL;
-}
-
// --- cSIProcessor ----------------------------------------------------------
#define MAX_FILTERS 20
@@ -1077,7 +1061,7 @@ const cCaDescriptor *cCaDescriptors::Get(int Source, int Transponder, int Servic
int cSIProcessor::numSIProcessors = 0;
cSchedules *cSIProcessor::schedules = NULL;
cMutex cSIProcessor::schedulesMutex;
-cCaDescriptors *cSIProcessor::caDescriptors = NULL;
+cList<cCaDescriptor> cSIProcessor::caDescriptors;
cMutex cSIProcessor::caDescriptorsMutex;
const char *cSIProcessor::epgDataFileName = EPGDATAFILENAME;
time_t cSIProcessor::lastDump = time(NULL);
@@ -1094,7 +1078,6 @@ cSIProcessor::cSIProcessor(const char *FileName)
filters = NULL;
if (!numSIProcessors++) { // the first one creates them
schedules = new cSchedules;
- caDescriptors = new cCaDescriptors;
}
filters = (SIP_FILTER *)calloc(MAX_FILTERS, sizeof(SIP_FILTER));
SetStatus(true);
@@ -1111,7 +1094,6 @@ cSIProcessor::~cSIProcessor()
free(filters);
if (!--numSIProcessors) { // the last one deletes them
delete schedules;
- delete caDescriptors;
}
free(fileName);
}
@@ -1176,12 +1158,9 @@ void cSIProcessor::SetStatus(bool On)
AddFilter(0x00, 0x00); // PAT
AddFilter(0x14, 0x70); // TDT
AddFilter(0x14, 0x73); // TOT
- AddFilter(0x12, 0x4e); // event info, actual TS, present/following
- AddFilter(0x12, 0x4f); // event info, other TS, present/following
- AddFilter(0x12, 0x50); // event info, actual TS, schedule
- AddFilter(0x12, 0x60); // event info, other TS, schedule
- AddFilter(0x12, 0x51); // event info, actual TS, schedule for another 4 days
- AddFilter(0x12, 0x61); // event info, other TS, schedule for another 4 days
+ AddFilter(0x12, 0x4e, 0xfe); // event info, actual(0x4e)/other(0x4f) TS, present/following
+ AddFilter(0x12, 0x50, 0xfe); // event info, actual TS, schedule(0x50)/schedule for another 4 days(0x51)
+ AddFilter(0x12, 0x60, 0xfe); // event info, other TS, schedule(0x60)/schedule for another 4 days(0x61)
}
}
@@ -1351,7 +1330,7 @@ void cSIProcessor::Action()
/** Add a filter with packet identifier pid and
table identifer tid */
-bool cSIProcessor::AddFilter(unsigned short pid, u_char tid)
+bool cSIProcessor::AddFilter(unsigned short pid, u_char tid, u_char mask)
{
dmx_sct_filter_params sctFilterParams;
memset(&sctFilterParams, 0, sizeof(sctFilterParams));
@@ -1359,7 +1338,7 @@ bool cSIProcessor::AddFilter(unsigned short pid, u_char tid)
sctFilterParams.timeout = 0;
sctFilterParams.flags = DMX_IMMEDIATE_START;
sctFilterParams.filter.filter[0] = tid;
- sctFilterParams.filter.mask[0] = 0xFF;
+ sctFilterParams.filter.mask[0] = mask;
for (int a = 0; a < MAX_FILTERS; a++)
{
@@ -1443,36 +1422,40 @@ void cSIProcessor::TriggerDump(void)
lastDump = 0;
}
-void cSIProcessor::NewCaDescriptor(struct Descriptor *d, int ProgramID)
+void cSIProcessor::NewCaDescriptor(struct Descriptor *d, int ServiceId)
{
if (DescriptorTag(d) == DESCR_CA) {
struct CaDescriptor *cd = (struct CaDescriptor *)d;
- if (!caDescriptors->Get(currentSource, currentTransponder, ProgramID, cd->CA_type)) {
- cMutexLock MutexLock(&caDescriptorsMutex);
- caDescriptors->Add(new cCaDescriptor(currentSource, currentTransponder, ProgramID, cd->CA_type, cd->CA_PID, cd->DataLength, cd->Data));
- }
+ cMutexLock MutexLock(&caDescriptorsMutex);
+
+ for (cCaDescriptor *ca = caDescriptors.First(); ca; ca = caDescriptors.Next(ca)) {
+ if (ca->source == currentSource && ca->transponder == currentTransponder && ca->serviceId == ServiceId && ca->caSystem == cd->CA_type && ca->providerId == cd->ProviderID && ca->caPid == cd->CA_PID)
+ return;
+ }
+ caDescriptors.Add(new cCaDescriptor(currentSource, currentTransponder, ServiceId, cd->CA_type, cd->ProviderID, cd->CA_PID, cd->DataLength, cd->Data));
//XXX update???
}
}
-int cSIProcessor::GetCaDescriptors(int Source, int Transponder, int ServiceId, int BufSize, uchar *Data)
+int cSIProcessor::GetCaDescriptors(int Source, int Transponder, int ServiceId, const unsigned short *CaSystemIds, int BufSize, uchar *Data)
{
+ if (!CaSystemIds || !*CaSystemIds)
+ return 0;
if (BufSize > 0 && Data) {
cMutexLock MutexLock(&caDescriptorsMutex);
int length = 0;
- for (int i = -1; ; i--) {
- const cCaDescriptor *d = caDescriptors->Get(Source, Transponder, ServiceId, i);
- if (d) {
- if (length + d->Length() <= BufSize) {
- memcpy(Data + length, d->Data(), d->Length());
- length += d->Length();
+ do {
+ for (cCaDescriptor *d = caDescriptors.First(); d; d = caDescriptors.Next(d)) {
+ if (d->source == Source && d->transponder == Transponder && d->serviceId == ServiceId && d->caSystem == *CaSystemIds) {
+ if (length + d->Length() <= BufSize) {
+ memcpy(Data + length, d->Data(), d->Length());
+ length += d->Length();
+ }
+ else
+ return -1;
}
- else
- return -1;
}
- else
- break;
- }
+ } while (*++CaSystemIds);
return length;
}
return -1;