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),
tsFeedpM(0),
pidM(pidP),
tidM(tidP),
maskM(maskP),
ringBufferM(new cRingBufferFrame(eDmxMaxSectionCount * eDmxMaxSectionSize)),
deviceIndexM(deviceIndexP)
{
debug16("%s (%d, %d, %d, %d) [device %d]", __PRETTY_FUNCTION__, deviceIndexM, pidM, tidP, maskP, deviceIndexM);
int i;
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
socketM[0] = socketM[1] = -1;
@ -89,23 +68,12 @@ void cSatipSectionFilter::New(void)
int cSatipSectionFilter::Filter(void)
{
if (secBufM) {
int i;
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)) {
cFrame* section = new cFrame(secBufM, secLenM);
if (!ringBufferM->Put(section))
DELETE_POINTER(section);
if ((tidM & maskM) == (secBufM[0] & maskM)) {
if (ringBufferM && (secLenM > 0)) {
cFrame* section = new cFrame(secBufM, secLenM);
if (!ringBufferM->Put(section))
DELETE_POINTER(section);
}
}
}
return 0;

View File

@ -33,18 +33,13 @@ private:
uint16_t secLenM;
uint16_t tsFeedpM;
uint16_t pidM;
uint8_t tidM;
uint8_t maskM;
cRingBufferFrame *ringBufferM;
int deviceIndexM;
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);
void New(void);
int Filter(void);

View File

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

View File

@ -225,7 +225,7 @@ bool cSatipTuner::Connect(void)
if (streamIdM >= 0) {
if (!strcmp(*streamParamM, *lastParamM) && hasLockM) {
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);
debug1("%s Retuning [device %d]", __PRETTY_FUNCTION__, deviceIdM);