diff --git a/packages/multimedia/vdr-satip/package.mk b/packages/multimedia/vdr-satip/package.mk index f78092c950..abf54608bd 100644 --- a/packages/multimedia/vdr-satip/package.mk +++ b/packages/multimedia/vdr-satip/package.mk @@ -17,7 +17,7 @@ ################################################################################ PKG_NAME="vdr-satip" -PKG_VERSION="2.2.2" +PKG_VERSION="2.2.3" PKG_REV="1" PKG_ARCH="any" PKG_LICENSE="GPL" diff --git a/packages/multimedia/vdr-satip/patches/vdr-satip-pkgconfig.patch b/packages/multimedia/vdr-satip/patches/vdr-satip-01-pkgconfig.patch similarity index 100% rename from packages/multimedia/vdr-satip/patches/vdr-satip-pkgconfig.patch rename to packages/multimedia/vdr-satip/patches/vdr-satip-01-pkgconfig.patch diff --git a/packages/multimedia/vdr-satip/patches/vdr-satip-02-upstream.patch b/packages/multimedia/vdr-satip/patches/vdr-satip-02-upstream.patch new file mode 100644 index 0000000000..54e923cbf4 --- /dev/null +++ b/packages/multimedia/vdr-satip/patches/vdr-satip-02-upstream.patch @@ -0,0 +1,342 @@ +From 165fd5b14af2327f3cd5d5b6fbe814737a0ea423 Mon Sep 17 00:00:00 2001 +From: Tobias Grimm +Date: Sat, 5 Dec 2015 16:59:28 +0100 +Subject: [PATCH 1/3] Reorderd the transponder URL parameter in a way the + Panasonic CXW804 expects them (src/freq/pol/ro/msys/mtype/plts/sr/fec) + +This only applies to DVB-S. DVB-C and DVB-T might need further tweaking. +It's actually a bug of the Panasonic TV to expect the transponder parameters in +a specific order in the query string, but for now this seems to be the most +pragmatic workaround. +--- + param.c | 22 +++++++++++----------- + 1 file changed, 11 insertions(+), 11 deletions(-) + +diff --git a/param.c b/param.c +index c71902d..b5eaf1c 100644 +--- a/param.c ++++ b/param.c +@@ -163,11 +163,20 @@ cString GetTransponderUrlParameters(const cChannel *channelP) + dtp.SetModulation(QPSK); + dtp.SetRollOff(ROLLOFF_35); + } ++ ST(" S *") q += snprintf(q, STBUFLEFT, "src=%d&", ((src > 0) && (src <= 255)) ? src : 1); + q += snprintf(q, STBUFLEFT, "freq=%s", *dtoa(freq, "%lg")); +- ST(" S *") q += snprintf(q, STBUFLEFT, "&src=%d", ((src > 0) && (src <= 255)) ? src : 1); ++ ST(" S *") q += snprintf(q, STBUFLEFT, "&pol=%c", tolower(dtp.Polarization())); ++ ST(" S *") q += PrintUrlString(q, STBUFLEFT, dtp.RollOff(), SatipRollOffValues); ++ ST(" S *") q += PrintUrlString(q, STBUFLEFT, dtp.System(), SatipSystemValuesSat); ++ ST("C *") q += PrintUrlString(q, STBUFLEFT, dtp.System(), SatipSystemValuesCable); ++ ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.System(), SatipSystemValuesTerrestrial); ++ ST(" S *") q += PrintUrlString(q, STBUFLEFT, dtp.Modulation(), SatipModulationValues); ++ ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.Modulation(), SatipModulationValues); ++ ST("C 1") q += PrintUrlString(q, STBUFLEFT, dtp.Modulation(), SatipModulationValues); ++ ST(" S *") q += PrintUrlString(q, STBUFLEFT, dtp.Pilot(), SatipPilotValues); + ST(" S *") q += snprintf(q, STBUFLEFT, "&sr=%d", channelP->Srate()); ++ ST("CST*") q += PrintUrlString(q, STBUFLEFT, dtp.CoderateH(), SatipCodeRateValues); + ST("C 1") q += snprintf(q, STBUFLEFT, "&sr=%d", channelP->Srate()); +- ST(" S *") q += snprintf(q, STBUFLEFT, "&pol=%c", tolower(dtp.Polarization())); + ST("C T2") q += snprintf(q, STBUFLEFT, "&plp=%d", dtp.StreamId()); + ST(" T2") q += snprintf(q, STBUFLEFT, "&t2id=%d", dtp.T2SystemId()); + ST("C 2") q += snprintf(q, STBUFLEFT, "&c2tft=%d", C2TuningFrequencyType); +@@ -177,15 +186,6 @@ cString GetTransponderUrlParameters(const cChannel *channelP) + ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.Bandwidth(), SatipBandwidthValues); + ST("C 2") q += PrintUrlString(q, STBUFLEFT, dtp.Bandwidth(), SatipBandwidthValues); + ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.Guard(), SatipGuardValues); +- ST("CST*") q += PrintUrlString(q, STBUFLEFT, dtp.CoderateH(), SatipCodeRateValues); +- ST(" S *") q += PrintUrlString(q, STBUFLEFT, dtp.Pilot(), SatipPilotValues); +- ST(" S *") q += PrintUrlString(q, STBUFLEFT, dtp.Modulation(), SatipModulationValues); +- ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.Modulation(), SatipModulationValues); +- ST("C 1") q += PrintUrlString(q, STBUFLEFT, dtp.Modulation(), SatipModulationValues); +- ST(" S *") q += PrintUrlString(q, STBUFLEFT, dtp.RollOff(), SatipRollOffValues); +- ST(" S *") q += PrintUrlString(q, STBUFLEFT, dtp.System(), SatipSystemValuesSat); +- ST("C *") q += PrintUrlString(q, STBUFLEFT, dtp.System(), SatipSystemValuesCable); +- ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.System(), SatipSystemValuesTerrestrial); + ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.Transmission(), SatipTransmissionValues); + if ((channelP->Rid() % 100) > 0) + snprintf(q, STBUFLEFT, "&fe=%d", channelP->Rid() % 100); + +From c1a881ba9459146541ef07ea1519fd45e5603d2c Mon Sep 17 00:00:00 2001 +From: Rolf Ahrenberg +Date: Sat, 5 Dec 2015 20:23:32 +0200 +Subject: [PATCH 2/3] Reorder also terrestrial and cable query parameters as + introduced in the satip specification 1.2.2, although the ordering shouldn't + matter according to it. + +--- + param.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +diff --git a/param.c b/param.c +index b5eaf1c..c9c4529 100644 +--- a/param.c ++++ b/param.c +@@ -163,32 +163,32 @@ cString GetTransponderUrlParameters(const cChannel *channelP) + dtp.SetModulation(QPSK); + dtp.SetRollOff(ROLLOFF_35); + } ++ if ((channelP->Rid() % 100) > 0) ++ q += snprintf(q, STBUFLEFT, "&fe=%d", channelP->Rid() % 100); + ST(" S *") q += snprintf(q, STBUFLEFT, "src=%d&", ((src > 0) && (src <= 255)) ? src : 1); + q += snprintf(q, STBUFLEFT, "freq=%s", *dtoa(freq, "%lg")); + ST(" S *") q += snprintf(q, STBUFLEFT, "&pol=%c", tolower(dtp.Polarization())); + ST(" S *") q += PrintUrlString(q, STBUFLEFT, dtp.RollOff(), SatipRollOffValues); ++ ST("C 2") q += snprintf(q, STBUFLEFT, "&c2tft=%d", C2TuningFrequencyType); ++ ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.Bandwidth(), SatipBandwidthValues); ++ ST("C 2") q += PrintUrlString(q, STBUFLEFT, dtp.Bandwidth(), SatipBandwidthValues); + ST(" S *") q += PrintUrlString(q, STBUFLEFT, dtp.System(), SatipSystemValuesSat); + ST("C *") q += PrintUrlString(q, STBUFLEFT, dtp.System(), SatipSystemValuesCable); + ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.System(), SatipSystemValuesTerrestrial); ++ ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.Transmission(), SatipTransmissionValues); + ST(" S *") q += PrintUrlString(q, STBUFLEFT, dtp.Modulation(), SatipModulationValues); + ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.Modulation(), SatipModulationValues); + ST("C 1") q += PrintUrlString(q, STBUFLEFT, dtp.Modulation(), SatipModulationValues); + ST(" S *") q += PrintUrlString(q, STBUFLEFT, dtp.Pilot(), SatipPilotValues); + ST(" S *") q += snprintf(q, STBUFLEFT, "&sr=%d", channelP->Srate()); +- ST("CST*") q += PrintUrlString(q, STBUFLEFT, dtp.CoderateH(), SatipCodeRateValues); + ST("C 1") q += snprintf(q, STBUFLEFT, "&sr=%d", channelP->Srate()); ++ ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.Guard(), SatipGuardValues); ++ ST("CST*") q += PrintUrlString(q, STBUFLEFT, dtp.CoderateH(), SatipCodeRateValues); ++ ST("C 2") q += snprintf(q, STBUFLEFT, "&ds=%d", DataSlice); + ST("C T2") q += snprintf(q, STBUFLEFT, "&plp=%d", dtp.StreamId()); + ST(" T2") q += snprintf(q, STBUFLEFT, "&t2id=%d", dtp.T2SystemId()); +- ST("C 2") q += snprintf(q, STBUFLEFT, "&c2tft=%d", C2TuningFrequencyType); +- ST("C 2") q += snprintf(q, STBUFLEFT, "&ds=%d", DataSlice); +- ST("C 1") q += PrintUrlString(q, STBUFLEFT, dtp.Inversion(), SatipInversionValues); + ST(" T2") q += PrintUrlString(q, STBUFLEFT, dtp.SisoMiso(), SatipSisoMisoValues); +- ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.Bandwidth(), SatipBandwidthValues); +- ST("C 2") q += PrintUrlString(q, STBUFLEFT, dtp.Bandwidth(), SatipBandwidthValues); +- ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.Guard(), SatipGuardValues); +- ST(" T*") q += PrintUrlString(q, STBUFLEFT, dtp.Transmission(), SatipTransmissionValues); +- if ((channelP->Rid() % 100) > 0) +- snprintf(q, STBUFLEFT, "&fe=%d", channelP->Rid() % 100); ++ ST("C 1") q += PrintUrlString(q, STBUFLEFT, dtp.Inversion(), SatipInversionValues); + #undef ST + return buffer; + } + +From 9d5f7cc7030657f38c56f6041ff7f697774a9624 Mon Sep 17 00:00:00 2001 +From: chriszero +Date: Thu, 7 Jan 2016 20:56:39 +0100 +Subject: [PATCH 3/3] Make it possible to specify the rtp and rtcp ports this + makes it possible to use the satip through a NAT (e.g. a docker bridged + network) + +--- + README | 5 +++++ + config.c | 2 ++ + config.h | 6 ++++++ + satip.c | 40 ++++++++++++++++++++++++++++++++++++++-- + socket.c | 4 ++-- + socket.h | 2 +- + tuner.c | 7 +++++-- + 7 files changed, 59 insertions(+), 7 deletions(-) + +diff --git a/README b/README +index 49b0b38..1c3b610 100644 +--- a/README ++++ b/README +@@ -56,6 +56,11 @@ vdr -P 'satip -s ||;...' + vdr -P 'satip -s 192.168.0.1|DVBS2-2,DVBT2-2|Octo1' + vdr -P 'satip -s 192.168.0.1|DVBS2-4|Octo1;192.168.0.2|DVBT2-4|Octo2' + ++The plugin accepts a "--portrange" (-p) command-line parameter, that can ++be used to manually specify the RTP & RTCP port range and therefore ++enables using the plugin through a NAT (e.g. Docker bridged network). ++A minimum of 2 ports per device is required. ++ + SAT>IP satellite positions (aka. signal sources) shall be defined via + sources.conf. If the source description begins with a number, it's used + as SAT>IP signal source selection parameter. A special number zero can +diff --git a/config.c b/config.c +index 050453c..2243aaa 100644 +--- a/config.c ++++ b/config.c +@@ -17,6 +17,8 @@ cSatipConfig::cSatipConfig(void) + ciExtensionM(0), + eitScanM(1), + useBytesM(1), ++ portRangeStartM(0), ++ portRangeStopM(0), + detachedModeM(false), + disableServerQuirksM(false), + useSingleModelServersM(false) +diff --git a/config.h b/config.h +index b7745cf..b11b1d8 100644 +--- a/config.h ++++ b/config.h +@@ -19,6 +19,8 @@ class cSatipConfig + unsigned int ciExtensionM; + unsigned int eitScanM; + unsigned int useBytesM; ++ unsigned int portRangeStartM; ++ unsigned int portRangeStopM; + bool detachedModeM; + bool disableServerQuirksM; + bool useSingleModelServersM; +@@ -74,6 +76,8 @@ class cSatipConfig + int GetDisabledSources(unsigned int indexP) const; + unsigned int GetDisabledFiltersCount(void) const; + int GetDisabledFilters(unsigned int indexP) const; ++ unsigned int GetPortRangeStart(void) const { return portRangeStartM; } ++ unsigned int GetPortRangeStop(void) const { return portRangeStopM; } + + void SetOperatingMode(unsigned int operatingModeP) { operatingModeM = operatingModeP; } + void SetTraceMode(unsigned int modeP) { traceModeM = (modeP & eTraceModeMask); } +@@ -86,6 +90,8 @@ class cSatipConfig + void SetUseSingleModelServers(bool onOffP) { useSingleModelServersM = onOffP; } + void SetDisabledSources(unsigned int indexP, int sourceP); + void SetDisabledFilters(unsigned int indexP, int numberP); ++ void SetPortRangeStart(unsigned int rangeStartP) { portRangeStartM = rangeStartP; } ++ void SetPortRangeStop(unsigned int rangeStopP) { portRangeStopM = rangeStopP; } + }; + + extern cSatipConfig SatipConfig; +diff --git a/satip.c b/satip.c +index 3453c48..35a92fe 100644 +--- a/satip.c ++++ b/satip.c +@@ -35,6 +35,7 @@ class cPluginSatip : public cPlugin { + unsigned int deviceCountM; + cSatipDiscoverServers *serversM; + void ParseServer(const char *paramP); ++ void ParsePortRange(const char *paramP); + int ParseCicams(const char *valueP, int *cicamsP); + int ParseSources(const char *valueP, int *sourcesP); + int ParseFilters(const char *valueP, int *filtersP); +@@ -87,7 +88,9 @@ const char *cPluginSatip::CommandLineHelp(void) + " define hard-coded SAT>IP server(s)\n" + " -D, --detach set the detached mode on\n" + " -S, --single set the single model server mode on\n" +- " -n, --noquirks disable all the server quirks\n"; ++ " -n, --noquirks disable all the server quirks\n" ++ " -p, --portrange=- set a range of ports used for the RT[C]P server\n" ++ " a minimum of 2 ports per device is required.\n"; + } + + bool cPluginSatip::ProcessArgs(int argc, char *argv[]) +@@ -98,6 +101,7 @@ bool cPluginSatip::ProcessArgs(int argc, char *argv[]) + { "devices", required_argument, NULL, 'd' }, + { "trace", required_argument, NULL, 't' }, + { "server", required_argument, NULL, 's' }, ++ { "portrange",required_argument, NULL, 'p' }, + { "detach", no_argument, NULL, 'D' }, + { "single", no_argument, NULL, 'S' }, + { "noquirks", no_argument, NULL, 'n' }, +@@ -105,8 +109,9 @@ bool cPluginSatip::ProcessArgs(int argc, char *argv[]) + }; + + cString server; ++ cString portrange; + int c; +- while ((c = getopt_long(argc, argv, "d:t:s:DSn", long_options, NULL)) != -1) { ++ while ((c = getopt_long(argc, argv, "d:t:s:p:DSn", long_options, NULL)) != -1) { + switch (c) { + case 'd': + deviceCountM = strtol(optarg, NULL, 0); +@@ -126,10 +131,15 @@ bool cPluginSatip::ProcessArgs(int argc, char *argv[]) + case 'n': + SatipConfig.SetDisableServerQuirks(true); + break; ++ case 'p': ++ portrange = optarg; ++ break; + default: + return false; + } + } ++ if (!isempty(*portrange)) ++ ParsePortRange(portrange); + // this must be done after all parameters are parsed + if (!isempty(*server)) + ParseServer(*server); +@@ -255,6 +265,32 @@ void cPluginSatip::ParseServer(const char *paramP) + FREE_POINTER(p); + } + ++void cPluginSatip::ParsePortRange(const char *paramP) ++{ ++ char *s, *p = skipspace(paramP); ++ char *r = strtok_r(p, "-", &s); ++ unsigned int rangeStart = 0; ++ unsigned int rangeStop = 0; ++ if (r) { ++ rangeStart = strtol(r, NULL, 0); ++ r = strtok_r(NULL, "-", &s); ++ } ++ if (r) ++ rangeStop = strtol(r, NULL, 0); ++ else { ++ error("Port range argument not valid '%s'", paramP); ++ rangeStart = 0; ++ rangeStop = 0; ++ } ++ if (rangeStop - rangeStart + 1 < deviceCountM * 2) { ++ error("The given port range is to small: %d < %d!", rangeStop - rangeStart + 1, deviceCountM * 2); ++ rangeStart = 0; ++ rangeStop = 0; ++ } ++ SatipConfig.SetPortRangeStart(rangeStart); ++ SatipConfig.SetPortRangeStop(rangeStop); ++} ++ + int cPluginSatip::ParseCicams(const char *valueP, int *cicamsP) + { + debug1("%s (%s,)", __PRETTY_FUNCTION__, valueP); +diff --git a/socket.c b/socket.c +index 29c2602..35bc035 100644 +--- a/socket.c ++++ b/socket.c +@@ -34,7 +34,7 @@ cSatipSocket::~cSatipSocket() + Close(); + } + +-bool cSatipSocket::Open(const int portP) ++bool cSatipSocket::Open(const int portP, const bool reuseAddrP) + { + // Bind to the socket if it is not active already + if (socketDescM < 0) { +@@ -46,7 +46,7 @@ bool cSatipSocket::Open(const int portP) + ERROR_IF_FUNC(fcntl(socketDescM, F_SETFL, O_NONBLOCK), "fcntl(O_NONBLOCK)", + Close(), return false); + // Allow multiple sockets to use the same PORT number +- int yes = 1; ++ int yes = reuseAddrP; + ERROR_IF_FUNC(setsockopt(socketDescM, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0, + "setsockopt(SO_REUSEADDR)", Close(), return false); + // Bind socket +diff --git a/socket.h b/socket.h +index f9a93d8..79bc991 100644 +--- a/socket.h ++++ b/socket.h +@@ -19,7 +19,7 @@ class cSatipSocket { + public: + cSatipSocket(); + virtual ~cSatipSocket(); +- bool Open(const int portP = 0); ++ bool Open(const int portP = 0, const bool reuseAddrP = false); + virtual void Close(void); + int Fd(void) { return socketDescM; } + int Port(void) { return socketPortM; } +diff --git a/tuner.c b/tuner.c +index c12a19e..fc47b51 100644 +--- a/tuner.c ++++ b/tuner.c +@@ -50,12 +50,15 @@ cSatipTuner::cSatipTuner(cSatipDeviceIf &deviceP, unsigned int packetLenP) + debug1("%s (, %d) [device %d]", __PRETTY_FUNCTION__, packetLenP, deviceIdM); + + // Open sockets +- int i = 100; ++ int i = SatipConfig.GetPortRangeStart() ? SatipConfig.GetPortRangeStop() - SatipConfig.GetPortRangeStart() - 1 : 100; ++ int port = SatipConfig.GetPortRangeStart(); + while (i-- > 0) { +- if (rtpM.Open(0) && rtcpM.Open(rtpM.Port() + 1)) ++ if (rtpM.Open(port) && rtcpM.Open(rtpM.Port() + 1)) + break; + rtpM.Close(); + rtcpM.Close(); ++ if (SatipConfig.GetPortRangeStart()) ++ ++port; + } + if ((rtpM.Port() <= 0) || (rtcpM.Port() <= 0)) { + error("Cannot open required RTP/RTCP ports [device %d]", deviceIdM);