Blob Blame History Raw
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;
           }
       }