1
0
mirror of https://github.com/rofafor/vdr-plugin-satip.git synced 2023-10-10 13:37:42 +02:00

Add support for source filtering.

This commit is contained in:
Rolf Ahrenberg 2016-07-23 22:40:01 +03:00
parent 13a6b5938f
commit c2fe2b748d
6 changed files with 92 additions and 38 deletions

3
README
View File

@ -52,9 +52,10 @@ separated list of "<ipaddress>|<model>|<description>" entries. The model
consists of a DVB system (DVBS2,DVBT2,DVBT,DVBC) and number of available consists of a DVB system (DVBS2,DVBT2,DVBT,DVBC) and number of available
frontends separated by a hyphen: frontends separated by a hyphen:
vdr -P 'satip -s <ipaddress>|<model>|<description>;...' vdr -P 'satip -s <ipaddress>[:<port>]|<model>[:<filter>]|<description>;...'
vdr -P 'satip -s 192.168.0.1|DVBS2-2,DVBT2-2|OctopusNet' vdr -P 'satip -s 192.168.0.1|DVBS2-2,DVBT2-2|OctopusNet'
vdr -P 'satip -s 192.168.0.1|DVBS2-4|OctopusNet;192.168.0.2|DVBT2-4|minisatip' vdr -P 'satip -s 192.168.0.1|DVBS2-4|OctopusNet;192.168.0.2|DVBT2-4|minisatip'
vdr -P 'satip -s 192.168.0.1:554|DVBS2-2:S19.2E|OctopusNet;192.168.0.2:8554|DVBS2-4:S19.2E,S1W|minisatip'
The plugin accepts a "--portrange" (-p) command-line parameter, that can The plugin accepts a "--portrange" (-p) command-line parameter, that can
be used to manually specify the RTP & RTCP port range and therefore be used to manually specify the RTP & RTCP port range and therefore

View File

@ -32,7 +32,7 @@ bool cSatipDiscover::Initialize(cSatipDiscoverServers *serversP)
if (instanceS) { if (instanceS) {
if (serversP) { if (serversP) {
for (cSatipDiscoverServer *s = serversP->First(); s; s = serversP->Next(s)) for (cSatipDiscoverServer *s = serversP->First(); s; s = serversP->Next(s))
instanceS->AddServer(s->IpAddress(), s->IpPort(), s->Model(), s->Description()); instanceS->AddServer(s->IpAddress(), s->IpPort(), s->Model(), s->Filters(), s->Description());
} }
else else
instanceS->Activate(); instanceS->Activate();
@ -271,12 +271,12 @@ void cSatipDiscover::ParseDeviceInfo(const char *addrP, const int portP)
model = modelNode.text().as_string("DVBS2-1"); model = modelNode.text().as_string("DVBS2-1");
} }
#endif #endif
AddServer(addrP, portP, model, desc); AddServer(addrP, portP, model, NULL, desc);
} }
void cSatipDiscover::AddServer(const char *addrP, const int portP, const char *modelP, const char * descP) void cSatipDiscover::AddServer(const char *addrP, const int portP, const char *modelP, const char *filtersP, const char *descP)
{ {
debug1("%s (%s, %d, %s, %s)", __PRETTY_FUNCTION__, addrP, portP, modelP, descP); debug1("%s (%s, %d, %s, %s, %s)", __PRETTY_FUNCTION__, addrP, portP, modelP, filtersP, descP);
cMutexLock MutexLock(&mutexM); cMutexLock MutexLock(&mutexM);
if (SatipConfig.GetUseSingleModelServers() && modelP && !isempty(modelP)) { if (SatipConfig.GetUseSingleModelServers() && modelP && !isempty(modelP)) {
int n = 0; int n = 0;
@ -285,9 +285,9 @@ void cSatipDiscover::AddServer(const char *addrP, const int portP, const char *m
while (r) { while (r) {
r = skipspace(r); r = skipspace(r);
cString desc = cString::sprintf("%s #%d", !isempty(descP) ? descP : "MyBrokenHardware", n++); cString desc = cString::sprintf("%s #%d", !isempty(descP) ? descP : "MyBrokenHardware", n++);
cSatipServer *tmp = new cSatipServer(addrP, portP, r, desc); cSatipServer *tmp = new cSatipServer(addrP, portP, r, filtersP, desc);
if (!serversM.Update(tmp)) { if (!serversM.Update(tmp)) {
info("Adding server '%s|%s|%s' CI: %s Quirks: %s", tmp->Address(), tmp->Model(), tmp->Description(), tmp->HasCI() ? "yes" : "no", tmp->HasQuirk() ? tmp->Quirks() : "none"); info("Adding server '%s|%s|%s' Filters: %s CI: %s Quirks: %s", tmp->Address(), tmp->Model(), tmp->Description(), !isempty(tmp->Filters()) ? tmp->Filters() : "none", tmp->HasCI() ? "yes" : "no", tmp->HasQuirk() ? tmp->Quirks() : "none");
serversM.Add(tmp); serversM.Add(tmp);
} }
else else
@ -297,9 +297,9 @@ void cSatipDiscover::AddServer(const char *addrP, const int portP, const char *m
FREE_POINTER(p); FREE_POINTER(p);
} }
else { else {
cSatipServer *tmp = new cSatipServer(addrP, portP, modelP, descP); cSatipServer *tmp = new cSatipServer(addrP, portP, modelP, filtersP, descP);
if (!serversM.Update(tmp)) { if (!serversM.Update(tmp)) {
info("Adding server '%s|%s|%s' CI: %s Quirks: %s", tmp->Address(), tmp->Model(), tmp->Description(), tmp->HasCI() ? "yes" : "no", tmp->HasQuirk() ? tmp->Quirks() : "none"); info("Adding server '%s|%s|%s' Filters: %s CI: %s Quirks: %s", tmp->Address(), tmp->Model(), tmp->Description(), !isempty(tmp->Filters()) ? tmp->Filters() : "none", tmp->HasCI() ? "yes" : "no", tmp->HasQuirk() ? tmp->Quirks() : "none");
serversM.Add(tmp); serversM.Add(tmp);
} }
else else

View File

@ -25,14 +25,16 @@ private:
cString ipAddressM; cString ipAddressM;
cString descriptionM; cString descriptionM;
cString modelM; cString modelM;
cString filtersM;
public: public:
cSatipDiscoverServer(const char *ipAddressP, const int ipPortP, const char *modelP, const char *descriptionP) cSatipDiscoverServer(const char *ipAddressP, const int ipPortP, const char *modelP, const char *filtersP, const char *descriptionP)
{ {
ipAddressM = ipAddressP; ipPortM = ipPortP; modelM = modelP; descriptionM = descriptionP; ipAddressM = ipAddressP; ipPortM = ipPortP; modelM = modelP; filtersM = filtersP; descriptionM = descriptionP;
} }
int IpPort(void) { return ipPortM; } int IpPort(void) { return ipPortM; }
const char *IpAddress(void) { return *ipAddressM; } const char *IpAddress(void) { return *ipAddressM; }
const char *Model(void) { return *modelM; } const char *Model(void) { return *modelM; }
const char *Filters(void) { return *filtersM; }
const char *Description(void) { return *descriptionM; } const char *Description(void) { return *descriptionM; }
}; };
@ -65,7 +67,7 @@ private:
void Deactivate(void); void Deactivate(void);
int ParseRtspPort(void); int ParseRtspPort(void);
void ParseDeviceInfo(const char *addrP, const int portP); void ParseDeviceInfo(const char *addrP, const int portP);
void AddServer(const char *addrP, const int portP, const char *modelP, const char *descP); void AddServer(const char *addrP, const int portP, const char *modelP, const char *filtersP, const char *descP);
void Fetch(const char *urlP); void Fetch(const char *urlP);
// constructor // constructor
cSatipDiscover(); cSatipDiscover();

15
satip.c
View File

@ -84,7 +84,7 @@ const char *cPluginSatip::CommandLineHelp(void)
// Return a string that describes all known command line options. // Return a string that describes all known command line options.
return " -d <num>, --devices=<number> set number of devices to be created\n" return " -d <num>, --devices=<number> set number of devices to be created\n"
" -t <mode>, --trace=<mode> set the tracing mode\n" " -t <mode>, --trace=<mode> set the tracing mode\n"
" -s <ipaddr>|<model>|<desc>, --server=<ipaddr1>|<model1>|<desc1>;<ipaddr2:port>|<model2>|<desc2>\n" " -s <ipaddr>|<model>|<desc>, --server=<ipaddr1>|<model1>|<desc1>;<ipaddr2>:<port>|<model2>:<filter>|<desc2>\n"
" define hard-coded SAT>IP server(s)\n" " define hard-coded SAT>IP server(s)\n"
" -D, --detach set the detached mode on\n" " -D, --detach set the detached mode on\n"
" -S, --single set the single model server mode on\n" " -S, --single set the single model server mode on\n"
@ -232,7 +232,7 @@ void cPluginSatip::ParseServer(const char *paramP)
while (r) { while (r) {
r = skipspace(r); r = skipspace(r);
debug3("%s server[%d]=%s", __PRETTY_FUNCTION__, n, r); debug3("%s server[%d]=%s", __PRETTY_FUNCTION__, n, r);
cString serverAddr, serverModel, serverDescription; cString serverAddr, serverModel, serverFilters, serverDescription;
int serverPort = SATIP_DEFAULT_RTSP_PORT; int serverPort = SATIP_DEFAULT_RTSP_PORT;
int n2 = 0; int n2 = 0;
char *s2, *p2 = r; char *s2, *p2 = r;
@ -251,7 +251,14 @@ void cPluginSatip::ParseServer(const char *paramP)
} }
break; break;
case 1: case 1:
{
serverModel = r2; serverModel = r2;
char *r3 = strchr(r2, ':');
if (r3) {
serverFilters = r3 + 1;
serverModel = serverModel.Truncate(r3 - r2);
}
}
break; break;
case 2: case 2:
serverDescription = r2; serverDescription = r2;
@ -262,10 +269,10 @@ void cPluginSatip::ParseServer(const char *paramP)
r2 = strtok_r(NULL, "|", &s2); r2 = strtok_r(NULL, "|", &s2);
} }
if (*serverAddr && *serverModel && *serverDescription) { if (*serverAddr && *serverModel && *serverDescription) {
debug1("%s ipaddr=%s port=%d model=%s desc=%s", __PRETTY_FUNCTION__, *serverAddr, serverPort, *serverModel, *serverDescription); debug1("%s ipaddr=%s port=%d model=%s (%s) desc=%s", __PRETTY_FUNCTION__, *serverAddr, serverPort, *serverModel, *serverFilters, *serverDescription);
if (!serversM) if (!serversM)
serversM = new cSatipDiscoverServers(); serversM = new cSatipDiscoverServers();
serversM->Add(new cSatipDiscoverServer(*serverAddr, serverPort, *serverModel, *serverDescription)); serversM->Add(new cSatipDiscoverServer(*serverAddr, serverPort, *serverModel, *serverFilters, *serverDescription));
} }
++n; ++n;
r = strtok_r(NULL, ";", &s); r = strtok_r(NULL, ";", &s);

View File

@ -80,9 +80,10 @@ bool cSatipFrontends::Detach(int deviceIdP, int transponderP)
// --- cSatipServer ----------------------------------------------------------- // --- cSatipServer -----------------------------------------------------------
cSatipServer::cSatipServer(const char *addressP, const int portP, const char *modelP, const char *descriptionP) cSatipServer::cSatipServer(const char *addressP, const int portP, const char *modelP, const char *filtersP, const char *descriptionP)
: addressM((addressP && *addressP) ? addressP : "0.0.0.0"), : addressM((addressP && *addressP) ? addressP : "0.0.0.0"),
modelM((modelP && *modelP) ? modelP : "DVBS-1"), modelM((modelP && *modelP) ? modelP : "DVBS-1"),
filtersM((filtersP && *filtersP) ? filtersP : ""),
descriptionM(!isempty(descriptionP) ? descriptionP : "MyBrokenHardware"), descriptionM(!isempty(descriptionP) ? descriptionP : "MyBrokenHardware"),
quirksM(""), quirksM(""),
portM(portP), portM(portP),
@ -92,6 +93,25 @@ cSatipServer::cSatipServer(const char *addressP, const int portP, const char *mo
createdM(time(NULL)), createdM(time(NULL)),
lastSeenM(0) lastSeenM(0)
{ {
memset(sourceFiltersM, 0, sizeof(sourceFiltersM));
if (!isempty(*filtersM)) {
char *s, *p = strdup(*filtersM);
char *r = strtok_r(p, ",", &s);
unsigned int i = 0;
while (r) {
int t = cSource::FromString(skipspace(r));
if (t && i < ELEMENTS(sourceFiltersM))
sourceFiltersM[i++] = t;
r = strtok_r(NULL, ",", &s);
}
if (i) {
filtersM = "";
for (unsigned int j = 0; j < i; ++j)
filtersM = cString::sprintf("%s%s%s", *filtersM, isempty(*filtersM) ? "" : ",", *cSource::ToString(sourceFiltersM[j]));
debug3("%s filters=%s", __PRETTY_FUNCTION__, *filtersM);
}
FREE_POINTER(p);
}
if (!SatipConfig.GetDisableServerQuirks()) { if (!SatipConfig.GetDisableServerQuirks()) {
// These devices contain a session id bug: // These devices contain a session id bug:
// Inverto Airscreen Server IDL 400 ? // Inverto Airscreen Server IDL 400 ?
@ -165,7 +185,7 @@ cSatipServer::cSatipServer(const char *addressP, const int portP, const char *mo
} }
r = strtok_r(NULL, ",", &s); r = strtok_r(NULL, ",", &s);
} }
free(p); FREE_POINTER(p);
} }
cSatipServer::~cSatipServer() cSatipServer::~cSatipServer()
@ -204,33 +224,50 @@ bool cSatipServer::Assign(int deviceIdP, int sourceP, int systemP, int transpond
return result; return result;
} }
bool cSatipServer::IsValidSource(int sourceP)
{
if (sourceFiltersM[0]) {
for (unsigned int i = 0; i < ELEMENTS(sourceFiltersM); ++i) {
if (sourceP == sourceFiltersM[i]) {
return true;
}
}
return false;
}
return true;
}
bool cSatipServer::Matches(int sourceP) bool cSatipServer::Matches(int sourceP)
{ {
if (cSource::IsType(sourceP, 'S')) if (IsValidSource(sourceP)) {
return GetModulesDVBS2(); if (cSource::IsType(sourceP, 'S'))
else if (cSource::IsType(sourceP, 'T')) return GetModulesDVBS2();
return GetModulesDVBT() || GetModulesDVBT2(); else if (cSource::IsType(sourceP, 'T'))
else if (cSource::IsType(sourceP, 'C')) return GetModulesDVBT() || GetModulesDVBT2();
return GetModulesDVBC() || GetModulesDVBC2(); else if (cSource::IsType(sourceP, 'C'))
return GetModulesDVBC() || GetModulesDVBC2();
}
return false; return false;
} }
bool cSatipServer::Matches(int deviceIdP, int sourceP, int systemP, int transponderP) bool cSatipServer::Matches(int deviceIdP, int sourceP, int systemP, int transponderP)
{ {
bool result = false; bool result = false;
if (cSource::IsType(sourceP, 'S')) if (IsValidSource(sourceP)) {
result = frontendsM[eSatipFrontendDVBS2].Matches(deviceIdP, transponderP); if (cSource::IsType(sourceP, 'S'))
else if (cSource::IsType(sourceP, 'T')) { result = frontendsM[eSatipFrontendDVBS2].Matches(deviceIdP, transponderP);
if (systemP) else if (cSource::IsType(sourceP, 'T')) {
result = frontendsM[eSatipFrontendDVBT2].Matches(deviceIdP, transponderP); if (systemP)
else result = frontendsM[eSatipFrontendDVBT2].Matches(deviceIdP, transponderP);
result = frontendsM[eSatipFrontendDVBT].Matches(deviceIdP, transponderP) || frontendsM[eSatipFrontendDVBT2].Matches(deviceIdP, transponderP); else
} result = frontendsM[eSatipFrontendDVBT].Matches(deviceIdP, transponderP) || frontendsM[eSatipFrontendDVBT2].Matches(deviceIdP, transponderP);
else if (cSource::IsType(sourceP, 'C')) { }
if (systemP) else if (cSource::IsType(sourceP, 'C')) {
result = frontendsM[eSatipFrontendDVBC2].Matches(deviceIdP, transponderP); if (systemP)
else result = frontendsM[eSatipFrontendDVBC2].Matches(deviceIdP, transponderP);
result = frontendsM[eSatipFrontendDVBC].Matches(deviceIdP, transponderP) || frontendsM[eSatipFrontendDVBC2].Matches(deviceIdP, transponderP); else
result = frontendsM[eSatipFrontendDVBC].Matches(deviceIdP, transponderP) || frontendsM[eSatipFrontendDVBC2].Matches(deviceIdP, transponderP);
}
} }
return result; return result;
} }

View File

@ -54,17 +54,23 @@ private:
eSatipFrontendDVBC2, eSatipFrontendDVBC2,
eSatipFrontendCount eSatipFrontendCount
}; };
enum {
eSatipMaxSourceFilters = 16
};
cString addressM; cString addressM;
cString modelM; cString modelM;
cString filtersM;
cString descriptionM; cString descriptionM;
cString quirksM; cString quirksM;
cSatipFrontends frontendsM[eSatipFrontendCount]; cSatipFrontends frontendsM[eSatipFrontendCount];
int sourceFiltersM[eSatipMaxSourceFilters];
int portM; int portM;
int quirkM; int quirkM;
bool hasCiM; bool hasCiM;
bool activeM; bool activeM;
time_t createdM; time_t createdM;
cTimeMs lastSeenM; cTimeMs lastSeenM;
bool IsValidSource(int sourceP);
public: public:
enum eSatipQuirk { enum eSatipQuirk {
@ -75,7 +81,7 @@ public:
eSatipQuirkRtpOverTcp = 0x08, eSatipQuirkRtpOverTcp = 0x08,
eSatipQuirkMask = 0x0F eSatipQuirkMask = 0x0F
}; };
cSatipServer(const char *addressP, const int portP, const char *modelP, const char *descriptionP); cSatipServer(const char *addressP, const int portP, const char *modelP, const char *filtersP, const char *descriptionP);
virtual ~cSatipServer(); virtual ~cSatipServer();
virtual int Compare(const cListObject &listObjectP) const; virtual int Compare(const cListObject &listObjectP) const;
bool Assign(int deviceIdP, int sourceP, int systemP, int transponderP); bool Assign(int deviceIdP, int sourceP, int systemP, int transponderP);
@ -91,6 +97,7 @@ public:
void Activate(bool onOffP) { activeM = onOffP; } void Activate(bool onOffP) { activeM = onOffP; }
const char *Address(void) { return *addressM; } const char *Address(void) { return *addressM; }
const char *Model(void) { return *modelM; } const char *Model(void) { return *modelM; }
const char *Filters(void) { return *filtersM; }
const char *Description(void) { return *descriptionM; } const char *Description(void) { return *descriptionM; }
const char *Quirks(void) { return *quirksM; } const char *Quirks(void) { return *quirksM; }
int Port(void) { return portM; } int Port(void) { return portM; }