diff -Nurp vdr-2.4.1.orig/channels.c vdr-2.4.1.NitTid/channels.c
--- vdr-2.4.1.orig/channels.c 2017-06-10 17:08:56.000000000 +0200
+++ vdr-2.4.1.NitTid/channels.c 2019-09-24 20:48:49.243342312 +0200
@@ -1096,11 +1096,13 @@ cChannel *cChannels::NewChannel(const cC
#define CHANNELMARKOBSOLETE "OBSOLETE"
#define CHANNELTIMEOBSOLETE 3600 // seconds to wait before declaring a channel obsolete (in case it has actually been seen before)
-bool cChannels::MarkObsoleteChannels(int Source, int Nid, int Tid)
+bool cChannels::MarkObsoleteChannels(int Source, int Nid, int Tid, int Transponder)
{
bool ChannelsModified = false;
for (cChannel *Channel = First(); Channel; Channel = Next(Channel)) {
if (time(NULL) - Channel->Seen() > CHANNELTIMEOBSOLETE && Channel->Source() == Source && Channel->Nid() == Nid && Channel->Tid() == Tid && Channel->Rid() == 0) {
+ if (Transponder && !ISTRANSPONDER(Channel->Transponder(), Transponder)) // mark channels only on specified transponder
+ continue;
int OldShowChannelNamesWithSource = Setup.ShowChannelNamesWithSource;
Setup.ShowChannelNamesWithSource = 0;
if (!endswith(Channel->Name(), CHANNELMARKOBSOLETE))
diff -Nurp vdr-2.4.1.orig/channels.h vdr-2.4.1.NitTid/channels.h
--- vdr-2.4.1.orig/channels.h 2017-06-10 17:06:40.000000000 +0200
+++ vdr-2.4.1.NitTid/channels.h 2019-09-23 22:46:20.231197911 +0200
@@ -251,7 +251,7 @@ public:
///< and will be set to the current value of the list's internal state variable upon
///< return from this function.
cChannel *NewChannel(const cChannel *Transponder, const char *Name, const char *ShortName, const char *Provider, int Nid, int Tid, int Sid, int Rid = 0);
- bool MarkObsoleteChannels(int Source, int Nid, int Tid);
+ bool MarkObsoleteChannels(int Source, int Nid, int Tid, int Transponder = 0);
};
// Provide lock controlled access to the list:
diff -Nurp vdr-2.4.1.orig/eitscan.c vdr-2.4.1.NitTid/eitscan.c
--- vdr-2.4.1.orig/eitscan.c 2019-03-12 12:54:27.000000000 +0100
+++ vdr-2.4.1.NitTid/eitscan.c 2019-09-23 23:31:26.778124945 +0200
@@ -60,8 +60,11 @@ void cScanList::AddTransponder(const cCh
{
if (Channel->Source() && Channel->Transponder()) {
for (cScanData *sd = First(); sd; sd = Next(sd)) {
- if (sd->Source() == Channel->Source() && ISTRANSPONDER(sd->Transponder(), Channel->Transponder()))
- return;
+ if (sd->Source() == Channel->Source() && ISTRANSPONDER(sd->Transponder(), Channel->Transponder())) {
+ const cChannel *ch = sd->GetChannel();
+ if (ch->Nid() == Channel->Nid() && ch->Tid() == Channel->Tid()) // add a channel for each unique transponder/Nid/Tid triple
+ return;
+ }
}
Add(new cScanData(Channel));
}
@@ -78,8 +81,10 @@ void cTransponderList::AddTransponder(cC
{
for (cChannel *ch = First(); ch; ch = Next(ch)) {
if (ch->Source() == Channel->Source() && ch->Transponder() == Channel->Transponder()) {
- delete Channel;
- return;
+ if (ch->Nid() == Channel->Nid() && ch->Tid() == Channel->Tid()) { // add a channel for each unique transponder/Nid/Tid triple
+ delete Channel;
+ return;
+ }
}
}
Add(Channel);
diff -Nurp vdr-2.4.1.orig/nit.c vdr-2.4.1.NitTid/nit.c
--- vdr-2.4.1.orig/nit.c 2019-05-31 23:47:02.000000000 +0200
+++ vdr-2.4.1.NitTid/nit.c 2019-09-25 00:09:04.140501158 +0200
@@ -107,6 +107,7 @@ void cNitFilter::Process(u_short Pid, u_
}
for (SI::Loop::Iterator it2; (d = ts.transportStreamDescriptors.getNext(it2)); ) {
+ int tsTransponder = 0;
switch (d->getDescriptorTag()) {
case SI::SatelliteDeliverySystemDescriptorTag: {
SI::SatelliteDeliverySystemDescriptor *sd = (SI::SatelliteDeliverySystemDescriptor *)d;
@@ -125,6 +126,7 @@ void cNitFilter::Process(u_short Pid, u_
dtp.SetRollOff(System ? RollOffs[sd->getRollOff()] : ROLLOFF_AUTO);
int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
dbgnit(" %s %d %c %d %d DVB-S%d\n", *cSource::ToString(Source), Frequency, dtp.Polarization(), SymbolRate, cChannel::Transponder(Frequency, dtp.Polarization()), System ? 2 : 1);
+ tsTransponder = cChannel::Transponder(Frequency, dtp.Polarization());
if (Setup.UpdateChannels >= 5) {
bool found = false;
bool forceTransponderUpdate = false;
@@ -192,6 +194,7 @@ void cNitFilter::Process(u_short Pid, u_
dtp.SetModulation(Modulations[min(sd->getModulation(), 6)]);
int SymbolRate = BCD2INT(sd->getSymbolRate()) / 10;
dbgnit(" %s %d %d %d %d\n", *cSource::ToString(Source), Frequency, dtp.CoderateH(), dtp.Modulation(), SymbolRate);
+ tsTransponder = Frequency / 1000;
if (Setup.UpdateChannels >= 5) {
bool found = false;
bool forceTransponderUpdate = false;
@@ -248,6 +251,7 @@ void cNitFilter::Process(u_short Pid, u_
static int TransmissionModes[] = { TRANSMISSION_MODE_2K, TRANSMISSION_MODE_8K, TRANSMISSION_MODE_4K, TRANSMISSION_MODE_AUTO };
dtp.SetTransmission(TransmissionModes[sd->getTransmissionMode()]);
dbgnit(" %s %d %d %d %d %d %d %d %d\n", *cSource::ToString(Source), Frequency, dtp.Bandwidth(), dtp.Modulation(), dtp.Hierarchy(), dtp.CoderateH(), dtp.CoderateL(), dtp.Guard(), dtp.Transmission());
+ tsTransponder = Frequency / 1000000;
if (Setup.UpdateChannels >= 5) {
bool found = false;
bool forceTransponderUpdate = false;
@@ -298,6 +302,7 @@ void cNitFilter::Process(u_short Pid, u_
SI::ExtensionDescriptor *sd = (SI::ExtensionDescriptor *)d;
switch (sd->getExtensionDescriptorTag()) {
case SI::T2DeliverySystemDescriptorTag: {
+ tsTransponder = Transponder();
if (Setup.UpdateChannels >= 5) {
for (cChannel *Channel = Channels->First(); Channel; Channel = Channels->Next(Channel)) {
int Source = cSource::FromData(cSource::stTerr);
@@ -368,6 +373,11 @@ void cNitFilter::Process(u_short Pid, u_
break;
default: ;
}
+ if (Setup.UpdateChannels == 1 || Setup.UpdateChannels >= 3) {
+ // mark all channels with obsolete Nid/Tid on tuned transponder
+ if (tsTransponder && ISTRANSPONDER(tsTransponder, Transponder()) && (Channel()->Nid() != ts.getOriginalNetworkId() || Channel()->Tid() != ts.getTransportStreamId()))
+ ChannelsModified |= Channels->MarkObsoleteChannels(Source(), Channel()->Nid(), Channel()->Tid(), Transponder());
+ }
delete d;
}
}