1
0
mirror of https://github.com/rofafor/vdr-plugin-satip.git synced 2023-10-10 13:37:42 +02:00
Manuel Reimer 2022-10-25 18:58:29 +02:00 committed by GitHub
parent 64554ad0cc
commit a76ff4c25a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 31 additions and 54 deletions

View File

@ -18,35 +18,14 @@ cSatipSectionFilter::cSatipSectionFilter(int deviceIndexP, uint16_t pidP, uint8_
secLenM(0), secLenM(0),
tsFeedpM(0), tsFeedpM(0),
pidM(pidP), pidM(pidP),
tidM(tidP),
maskM(maskP),
ringBufferM(new cRingBufferFrame(eDmxMaxSectionCount * eDmxMaxSectionSize)), ringBufferM(new cRingBufferFrame(eDmxMaxSectionCount * eDmxMaxSectionSize)),
deviceIndexM(deviceIndexP) deviceIndexM(deviceIndexP)
{ {
debug16("%s (%d, %d, %d, %d) [device %d]", __PRETTY_FUNCTION__, deviceIndexM, pidM, tidP, maskP, deviceIndexM); debug16("%s (%d, %d, %d, %d) [device %d]", __PRETTY_FUNCTION__, deviceIndexM, pidM, tidP, maskP, deviceIndexM);
int i;
memset(secBufBaseM, 0, sizeof(secBufBaseM)); memset(secBufBaseM, 0, sizeof(secBufBaseM));
memset(filterValueM, 0, sizeof(filterValueM));
memset(filterMaskM, 0, sizeof(filterMaskM));
memset(filterModeM, 0, sizeof(filterModeM));
memset(maskAndModeM, 0, sizeof(maskAndModeM));
memset(maskAndNotModeM, 0, sizeof(maskAndNotModeM));
filterValueM[0] = tidP;
filterMaskM[0] = maskP;
// Invert the filter
for (i = 0; i < eDmxMaxFilterSize; ++i)
filterValueM[i] ^= 0xFF;
uint8_t doneq = 0;
for (i = 0; i < eDmxMaxFilterSize; ++i) {
uint8_t mode = filterModeM[i];
uint8_t mask = filterMaskM[i];
maskAndModeM[i] = (uint8_t)(mask & mode);
maskAndNotModeM[i] = (uint8_t)(mask & ~mode);
doneq |= maskAndNotModeM[i];
}
doneqM = doneq ? 1 : 0;
// Create sockets // Create sockets
socketM[0] = socketM[1] = -1; socketM[0] = socketM[1] = -1;
@ -89,25 +68,14 @@ void cSatipSectionFilter::New(void)
int cSatipSectionFilter::Filter(void) int cSatipSectionFilter::Filter(void)
{ {
if (secBufM) { if (secBufM) {
int i; if ((tidM & maskM) == (secBufM[0] & maskM)) {
uint8_t neq = 0;
for (i = 0; i < eDmxMaxFilterSize; ++i) {
uint8_t calcxor = (uint8_t)(filterValueM[i] ^ secBufM[i]);
if (maskAndModeM[i] & calcxor)
return 0;
neq |= (maskAndNotModeM[i] & calcxor);
}
if (doneqM && !neq)
return 0;
if (ringBufferM && (secLenM > 0)) { if (ringBufferM && (secLenM > 0)) {
cFrame* section = new cFrame(secBufM, secLenM); cFrame* section = new cFrame(secBufM, secLenM);
if (!ringBufferM->Put(section)) if (!ringBufferM->Put(section))
DELETE_POINTER(section); DELETE_POINTER(section);
} }
} }
}
return 0; return 0;
} }

View File

@ -33,18 +33,13 @@ private:
uint16_t secLenM; uint16_t secLenM;
uint16_t tsFeedpM; uint16_t tsFeedpM;
uint16_t pidM; uint16_t pidM;
uint8_t tidM;
uint8_t maskM;
cRingBufferFrame *ringBufferM; cRingBufferFrame *ringBufferM;
int deviceIndexM; int deviceIndexM;
int socketM[2]; int socketM[2];
uint8_t filterValueM[eDmxMaxFilterSize];
uint8_t filterMaskM[eDmxMaxFilterSize];
uint8_t filterModeM[eDmxMaxFilterSize];
uint8_t maskAndModeM[eDmxMaxFilterSize];
uint8_t maskAndNotModeM[eDmxMaxFilterSize];
inline uint16_t GetLength(const uint8_t *dataP); inline uint16_t GetLength(const uint8_t *dataP);
void New(void); void New(void);
int Filter(void); int Filter(void);

View File

@ -40,29 +40,43 @@ bool cSatipFrontends::Matches(int deviceIdP, int transponderP)
bool cSatipFrontends::Assign(int deviceIdP, int transponderP) bool cSatipFrontends::Assign(int deviceIdP, int transponderP)
{ {
cSatipFrontend *tmp = NULL; cSatipFrontend *tmp = NULL;
// Prefer any unused one // Prefer any used one
for (cSatipFrontend *f = First(); f; f = Next(f)) { for (cSatipFrontend *f = First(); f; f = Next(f)) {
if (!f->Attached() || (f->DeviceId() == deviceIdP)) { if (f->DeviceId() == deviceIdP) { // give deviceID priority, but take detached frontend if deviceID ist not yet attached
tmp = f; tmp = f;
break; break;
} }
if (!f->Attached()) {
tmp = f;
}
} }
if (tmp) { if (tmp) {
tmp->SetTransponder(transponderP); tmp->SetTransponder(transponderP);
debug9("%s assigned TP %d to %s/#%d", __PRETTY_FUNCTION__, transponderP, *tmp->Description(), tmp->Index());
return true; return true;
} }
error("no assignable frontend found [device %u]", deviceIdP);
return false; return false;
} }
bool cSatipFrontends::Attach(int deviceIdP, int transponderP) bool cSatipFrontends::Attach(int deviceIdP, int transponderP)
{ {
cSatipFrontend *tmp = NULL;
for (cSatipFrontend *f = First(); f; f = Next(f)) { for (cSatipFrontend *f = First(); f; f = Next(f)) {
if (f->Transponder() == transponderP) { if (f->Transponder() == transponderP) {
f->Attach(deviceIdP); tmp = f;
debug9("%s (%d, %d) %s/#%d", __PRETTY_FUNCTION__, deviceIdP, transponderP, *f->Description(), f->Index()); if (f->DeviceId() == deviceIdP) {
break;
}
}
}
if (tmp) {
tmp->Attach(deviceIdP);
debug9("%s attached deviceId %d (TP %d) to %s/#%d", __PRETTY_FUNCTION__, deviceIdP, transponderP, *tmp->Description(), tmp->Index());
return true; return true;
} }
} error("%s no Frontend found for attaching deviceID %d (TP %d)", __PRETTY_FUNCTION__, deviceIdP, transponderP);
return false; return false;
} }
@ -71,7 +85,7 @@ bool cSatipFrontends::Detach(int deviceIdP, int transponderP)
for (cSatipFrontend *f = First(); f; f = Next(f)) { for (cSatipFrontend *f = First(); f; f = Next(f)) {
if (f->Transponder() == transponderP) { if (f->Transponder() == transponderP) {
f->Detach(deviceIdP); f->Detach(deviceIdP);
debug9("%s (%d, %d) %s/#%d", __PRETTY_FUNCTION__, deviceIdP, transponderP, *f->Description(), f->Index()); debug9("%s detached deviceID %d (TP %d) from %s/#%d", __PRETTY_FUNCTION__, deviceIdP, transponderP, *f->Description(), f->Index());
return true; return true;
} }
} }

View File

@ -225,7 +225,7 @@ bool cSatipTuner::Connect(void)
if (streamIdM >= 0) { if (streamIdM >= 0) {
if (!strcmp(*streamParamM, *lastParamM) && hasLockM) { if (!strcmp(*streamParamM, *lastParamM) && hasLockM) {
debug1("%s Identical parameters [device %d]", __PRETTY_FUNCTION__, deviceIdM); debug1("%s Identical parameters [device %d]", __PRETTY_FUNCTION__, deviceIdM);
return true; //return true; // fall through because detection does not work reliably
} }
cString uri = cString::sprintf("%sstream=%d?%s", *connectionUri, streamIdM, *streamParamM); cString uri = cString::sprintf("%sstream=%d?%s", *connectionUri, streamIdM, *streamParamM);
debug1("%s Retuning [device %d]", __PRETTY_FUNCTION__, deviceIdM); debug1("%s Retuning [device %d]", __PRETTY_FUNCTION__, deviceIdM);