Blob Blame History Raw
diff -Nurp vdr-2.4.6.orig/channels.c vdr-2.4.6/channels.c
--- vdr-2.4.6.orig/channels.c	2020-04-11 11:22:05.000000000 +0200
+++ vdr-2.4.6/channels.c	2021-01-01 12:35:10.946734352 +0100
@@ -1115,11 +1116,20 @@ 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 Transponder, int StreamId, int Nid, int Tid)
 {
   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 (Channel->Source() != Source)
+         continue;
+      bool obsolete = false;
+      if (Channel->Nid() == Nid && Channel->Tid() == Tid)
+         obsolete = time(NULL) - Channel->Seen() > CHANNELTIMEOBSOLETE && Channel->Rid() == 0; // obsolete Sid
+      else if (ISTRANSPONDER(Channel->Transponder(), Transponder)) {
+         cDvbTransponderParameters dtp(Channel->Parameters());
+         obsolete = dtp.StreamId() == StreamId; // obsolete Nid/Tid
+         }
+      if (obsolete) {
          int OldShowChannelNamesWithSource = Setup.ShowChannelNamesWithSource;
          Setup.ShowChannelNamesWithSource = 0;
          if (!endswith(Channel->Name(), CHANNELMARKOBSOLETE))
diff -Nurp vdr-2.4.6.orig/channels.h vdr-2.4.6/channels.h
--- vdr-2.4.6.orig/channels.h	2020-06-10 16:00:36.000000000 +0200
+++ vdr-2.4.6/channels.h	2020-12-31 18:35:07.050191444 +0100
@@ -252,7 +252,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 Transponder, int Streamid, int Nid, int Tid);
   };
 
 // Provide lock controlled access to the list:
diff -Nurp vdr-2.4.6.orig/sdt.c vdr-2.4.6/sdt.c
--- vdr-2.4.6.orig/sdt.c	2020-06-16 16:50:07.000000000 +0200
+++ vdr-2.4.6/sdt.c	2020-12-31 18:40:31.853536210 +0100
@@ -12,6 +12,7 @@
 #include "config.h"
 #include "libsi/section.h"
 #include "libsi/descriptor.h"
+#include "dvbdevice.h"
 
 // Set to 'true' for debug output:
 static bool DebugSdt = false;
@@ -205,9 +206,10 @@ void cSdtFilter::Process(u_short Pid, u_
       }
   if (sdt.getSectionNumber() == sdt.getLastSectionNumber()) {
      if (Setup.UpdateChannels == 1 || Setup.UpdateChannels >= 3) {
-        ChannelsModified |= Channels->MarkObsoleteChannels(source, sdt.getOriginalNetworkId(), sdt.getTransportStreamId());
+        cDvbTransponderParameters dtp(Channel()->Parameters());
+        ChannelsModified |= Channels->MarkObsoleteChannels(source, Transponder(), dtp.StreamId(), sdt.getOriginalNetworkId(), sdt.getTransportStreamId());
         if (source != Source())
-           ChannelsModified |= Channels->MarkObsoleteChannels(Source(), sdt.getOriginalNetworkId(), sdt.getTransportStreamId());
+           ChannelsModified |= Channels->MarkObsoleteChannels(Source(), Transponder(), dtp.StreamId(), sdt.getOriginalNetworkId(), sdt.getTransportStreamId());
         }
      }
   StateKey.Remove(ChannelsModified);