commit:     c996e6e17cb14e56a966dfe4fe22166d6b80cfe9
Author:     Martin Dummer <martin.dummer <AT> gmx <DOT> net>
AuthorDate: Sat Feb  7 12:14:57 2026 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Wed Feb 11 07:47:54 2026 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=c996e6e1

media-video/vdr: drop 2.6.9, 2.7.3

Signed-off-by: Martin Dummer <martin.dummer <AT> gmx.net>
Part-of: https://github.com/gentoo/gentoo/pull/45665
Signed-off-by: Sam James <sam <AT> gentoo.org>

 media-video/vdr/Manifest                           |   4 -
 .../vdr/files/vdr-2.4.1_mainmenuhook-1.0.1.patch   | 114 ----
 .../vdr/files/vdr-2.6.1-patch-for-permashift.patch | 517 ------------------
 media-video/vdr/files/vdr-2.6.1_naludump.patch     | 598 ---------------------
 media-video/vdr/files/vdr-2.6.7_pinplugin.patch    | 447 ---------------
 .../vdr/files/vdr-2.7.2-patch-for-permashift.patch | 520 ------------------
 media-video/vdr/files/vdr-2.7.3_pinplugin.patch    | 435 ---------------
 media-video/vdr/vdr-2.6.9.ebuild                   | 199 -------
 media-video/vdr/vdr-2.7.3.ebuild                   | 197 -------
 9 files changed, 3031 deletions(-)

diff --git a/media-video/vdr/Manifest b/media-video/vdr/Manifest
index 53bf85269a03..69d88a33a5f3 100644
--- a/media-video/vdr/Manifest
+++ b/media-video/vdr/Manifest
@@ -1,9 +1,5 @@
 DIST extpng-vdr-2.2.0-gentoo-edition-v1.patch.bz2 34664 BLAKE2B 
81b68ebe0ef4588c3676f0b7a2c766d8d4d4f754a987b3be5868f3c6eff9158d4cea8e492ca81df535e637dbdc5baff638d1fafb4163e9d9a2d0125aba17e2e1
 SHA512 
16d6fbb8201f003dfe653b6a49424b794d7e697e27ad6f2383dbe17b76712ea5a3da88a676900b84d75ff7425bf3eb9084d60a89a4598758f482dc1f013f7b3e
 DIST vdr-2.2.0.tar.bz2 922708 BLAKE2B 
975e07d6d4c5bd13ee92be5d6a1826d6404b0c59e20fa2e30689b185a61e02d54782ad528e6a4f15e0d36806b30bcf48aa336d63adb3604e78056ff318e0fd2c
 SHA512 
183f58133915c6c0fe8ec2b88becbcb2a36418210e6dcf7931053d3771d727c3581593f9eb5c9693abf39e22e728f7b41c42079cd704610c3636ec05134ea93d
-DIST vdr-2.6.9.tbz2 949889 BLAKE2B 
25416907562b061a38fbe29478010d1d790695f1eab2ad8e7d58548986a84c494232a914f58bbfc00e1d99fc5dd915fa4f715706630c3e3f1d2708c86c548e26
 SHA512 
a28cd01be43825d8f3d1af076dcb3193fa2f66027d419e4da4fcbac094a966877f52133045488b2e4cd962a2828875f9bd6c582379c8b4fb5db82a737f128aee
-DIST vdr-2.6.9_ttxtsubs_v2.patch 40549 BLAKE2B 
525c05b72fa957372cc1ef91428428f664f42d92eebc06fd0b179afbe99e4ecc4919c69cef000cc15c8340c9a2506d38cbf755fd6665cde1708ce17d4320a35f
 SHA512 
590c43e63818de8be9637cb3b32bf3399b82a181ca151d67e2341232669619020ab78ba9934da3a9c58cdb3bac56fc2a332a5838a92ee0851e42c3707726eb49
-DIST vdr-2.7.3.tbz2 953575 BLAKE2B 
c2380c3ece50683faf63c0df09011859c61a66dbd684b87abe8deb60b0676937063271edc4c26809f4cc8fc95273386ce9ce8566244de1eb043c1e46842c9fa3
 SHA512 
a2e7421d94bdd5d994b7584115e3b297b069557b12a831363ab2fb4fe3a65117ec43fe24f988e290dd2fa33a50a6bc1fe33c1076b179a6fe1b5d24b786a0930d
-DIST vdr-2.7.3_ttxtsubs_v2.patch 40541 BLAKE2B 
5848009c6ef432a9852a0e86a448bb3d2c1a037523c5f1ce9563eb0e65ad4c174e4e1f290fd7f583cfa3915cad6297e1d4d7833b89883bb09c4dbf14d715656f
 SHA512 
d8123c91096ff9734cdc46bacd253b153627091a90aa94288dc60ea74792b5ab6e62cd48adc6b830d83ca81d7d6ad11d7b478aaad67d597d1141ffe8e29abbf8
 DIST vdr-2.7.7.tbz2 960454 BLAKE2B 
ce4961fb40fc62ead50cb7a39f2a539b5c08fdce494d9d49b4eaa09780c5ebc320cec2e5a61b15681937e1d5d6851bbcb05042fd2ce8f710b016848c146f3ac0
 SHA512 
22c561aea6c2ae29f27d024249501c3c748cd77e9c182ed969a59f24b4b360b59cf807e1214665bbec7797b6ec11beeac0b2f02e8427f0c91cf9c29144bd5154
 DIST vdr-2.7.7_naludump.patch 20054 BLAKE2B 
4c326c71b60d7d46cb5c846be7c415d41bde01920b28dc102e8f0f85dd59e1d489c5e042a5c35e131e5aebac042a58dfd49f584d1efb0362446111e8a2c347b1
 SHA512 
c6d467ad37cfd34eef6da83506140b563269b16a06fecf40b6d61b0c75b8019b353d3c740766b65f0a656770b185f51eec6bb08760c03ba9aba275c7846d6a79
 DIST vdr-2.7.7_patch-for-permashift.patch 15401 BLAKE2B 
c73a0b66745cbb3b97d7678e4f5597cf8be1b5153126967fa8d16ad2ee1db070ad521688d00d291392f83f7309de8210f8a170026db9f9cf90f3b39d90c75db7
 SHA512 
11fc1c2599687dcf774253295e3ce9bc7ef890c5e40102d183242b59d228ff0828151d5b40e6c6015f1140f077f24e32373dee15eeb972fe89aee40bf3d4589c

diff --git a/media-video/vdr/files/vdr-2.4.1_mainmenuhook-1.0.1.patch 
b/media-video/vdr/files/vdr-2.4.1_mainmenuhook-1.0.1.patch
deleted file mode 100644
index deec2cd7cfdb..000000000000
--- a/media-video/vdr/files/vdr-2.4.1_mainmenuhook-1.0.1.patch
+++ /dev/null
@@ -1,114 +0,0 @@
-original 
https://raw.githubusercontent.com/VDR4Arch/vdr4arch/master/vdr/vdr-MainMenuHooks.patch
-
-rebased for media-video/vdr-2.4.1
-
-Signed-off-by: Joerg Bornkessel <[email protected]> ( 2019 Dez 22 )
-diff -Naur vdr-2.4.1.orig/config.h vdr-2.4.1/config.h
---- vdr-2.4.1.orig/config.h    2019-12-22 00:04:59.000000000 +0100
-+++ vdr-2.4.1/config.h 2019-12-22 00:11:25.000000000 +0100
-@@ -36,6 +36,10 @@
- // plugins to work with newer versions of the core VDR as long as no
- // VDR header files have changed.
- 
-+// The MainMenuHook Patch's version number:
-+#define MAINMENUHOOKSVERSION "1.0.1"
-+#define MAINMENUHOOKSVERSNUM 10001  // Version * 10000 + Major * 100 + Minor
-+
- #define MAXPRIORITY       99
- #define MINPRIORITY       (-MAXPRIORITY)
- #define LIVEPRIORITY      0                  // priority used when selecting 
a device for live viewing
-diff -Naur vdr-2.4.1.orig/menu.c vdr-2.4.1/menu.c
---- vdr-2.4.1.orig/menu.c      2019-12-22 00:04:59.000000000 +0100
-+++ vdr-2.4.1/menu.c   2019-12-22 00:11:25.000000000 +0100
-@@ -4395,15 +4395,31 @@
- 
-   // Initial submenus:
- 
-+  cOsdObject *menu = NULL;
-   switch (State) {
--    case osSchedule:   AddSubMenu(new cMenuSchedule); break;
--    case osChannels:   AddSubMenu(new cMenuChannels); break;
--    case osTimers:     AddSubMenu(new cMenuTimers); break;
--    case osRecordings: AddSubMenu(new cMenuRecordings(NULL, 0, 
OpenSubMenus)); break;
--    case osSetup:      AddSubMenu(new cMenuSetup); break;
--    case osCommands:   AddSubMenu(new cMenuCommands(tr("Commands"), 
&Commands)); break;
-+    case osSchedule:
-+        if 
(!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osSchedule", 
&menu))
-+            menu = new cMenuSchedule;
-+        break;
-+    case osChannels:
-+        if 
(!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osChannels", 
&menu))
-+            menu = new cMenuChannels;
-+        break;
-+    case osTimers:
-+        if 
(!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osTimers", &menu))
-+            menu = new cMenuTimers;
-+        break;
-+    case osRecordings:
-+        if 
(!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osRecordings", 
&menu))
-+            menu = new cMenuRecordings(NULL, 0, OpenSubMenus);
-+        break;
-+    case osSetup:      menu = new cMenuSetup; break;
-+    case osCommands:   menu = new cMenuCommands(tr("Commands"), &Commands); 
break;
-     default: break;
-     }
-+  if (menu)
-+     if (menu->IsMenu())
-+        AddSubMenu((cOsdMenu *) menu);
- }
- 
- cOsdObject *cMenuMain::PluginOsdObject(void)
-@@ -4511,13 +4527,34 @@
-   eOSState state = cOsdMenu::ProcessKey(Key);
-   HadSubMenu |= HasSubMenu();
- 
-+  cOsdObject *menu = NULL;
-   switch (state) {
--    case osSchedule:   return AddSubMenu(new cMenuSchedule);
--    case osChannels:   return AddSubMenu(new cMenuChannels);
--    case osTimers:     return AddSubMenu(new cMenuTimers);
--    case osRecordings: return AddSubMenu(new cMenuRecordings);
--    case osSetup:      return AddSubMenu(new cMenuSetup);
--    case osCommands:   return AddSubMenu(new cMenuCommands(tr("Commands"), 
&Commands));
-+    case osSchedule:
-+        if 
(!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osSchedule", 
&menu))
-+            menu = new cMenuSchedule;
-+        else
-+            state = osContinue;
-+        break;
-+    case osChannels:
-+        if 
(!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osChannels", 
&menu))
-+            menu = new cMenuChannels;
-+        else
-+            state = osContinue;
-+        break;
-+    case osTimers:
-+        if 
(!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osTimers", &menu))
-+            menu = new cMenuTimers;
-+        else
-+            state = osContinue;
-+        break;
-+    case osRecordings:
-+        if 
(!cPluginManager::CallFirstService("MainMenuHooksPatch-v1.0::osRecordings", 
&menu))
-+            menu = new cMenuRecordings;
-+        else
-+            state = osContinue;
-+        break;
-+    case osSetup:      menu = new cMenuSetup; break;
-+    case osCommands:   menu = new cMenuCommands(tr("Commands"), &Commands); 
break;
-     case osStopRecord: if (Interface->Confirm(tr("Stop recording?"))) {
-                           if (cOsdItem *item = Get(Current())) {
-                              cRecordControls::Stop(item->Text() + 
strlen(tr(STOP_RECORDING)));
-@@ -4568,6 +4605,12 @@
-                default:      break;
-                }
-     }
-+  if (menu) {
-+     if (menu->IsMenu())
-+        return AddSubMenu((cOsdMenu *) menu);
-+     pluginOsdObject = menu;
-+     return osPlugin;
-+  } 
-   if (!HasSubMenu() && Update(HadSubMenu))
-      Display();
-   if (Key != kNone) {

diff --git a/media-video/vdr/files/vdr-2.6.1-patch-for-permashift.patch 
b/media-video/vdr/files/vdr-2.6.1-patch-for-permashift.patch
deleted file mode 100644
index 03b476f986bb..000000000000
--- a/media-video/vdr/files/vdr-2.6.1-patch-for-permashift.patch
+++ /dev/null
@@ -1,517 +0,0 @@
-Adapted Patch from forum post
-https://www.vdr-portal.de/forum/index.php?thread/134171-permashift-1-0-4-f%C3%BCr-vdr-2-4-betaversion/&postID=1341243#post1341243
-
-SRC Url 
https://www.vdr-portal.de/index.php?attachment/45632-vdr-2-5-4-patch-for-permashift-diff-gz/
 adapted for vdr-2.6.1
-
-Signed-off-by: Martin Dummer <[email protected]>
-
-diff -Naur vdr-2.6.1.orig/device.c vdr-2.6.1/device.c
---- vdr-2.6.1.orig/device.c    2022-02-02 10:56:43.000000000 +0100
-+++ vdr-2.6.1/device.c 2022-02-06 18:05:26.452890690 +0100
-@@ -1880,6 +1880,17 @@
-   ReleaseCamSlot();
- }
- 
-+cRecorder* cDevice::GetPreRecording(const cChannel *Channel)
-+{
-+  cMutexLock MutexLock(&mutexReceiver);
-+  for (int i = 0; i < MAXRECEIVERS; i++) {
-+      if (receiver[i])
-+        if (receiver[i]->IsPreRecording(Channel))
-+                return (cRecorder*)receiver[i];
-+      }
-+  return NULL;
-+}
-+
- // --- cTSBuffer -------------------------------------------------------------
- 
- cTSBuffer::cTSBuffer(int File, int Size, int DeviceNumber)
-diff -Naur vdr-2.6.1.orig/device.h vdr-2.6.1/device.h
---- vdr-2.6.1.orig/device.h    2022-02-02 10:56:43.000000000 +0100
-+++ vdr-2.6.1/device.h 2022-02-06 18:05:51.541429884 +0100
-@@ -85,6 +85,7 @@
- 
- class cPlayer;
- class cReceiver;
-+class cRecorder;
- class cLiveSubtitle;
- 
- class cDeviceHook : public cListObject {
-@@ -854,6 +855,8 @@
-        ///< Returns true if we are currently receiving. The parameter has no 
meaning (for backwards compatibility only).
-   bool AttachReceiver(cReceiver *Receiver);
-        ///< Attaches the given receiver to this device.
-+  cRecorder* GetPreRecording(const cChannel *Channel);
-+       ///< Get precocious recording for the channel if there is one.
-   void Detach(cReceiver *Receiver, bool ReleaseCam = true);
-        ///< Detaches the given receiver from this device.
-        ///< If ReleaseCam is true, the CAM slot will be released if it
-diff -Naur vdr-2.6.1.orig/dvbplayer.c vdr-2.6.1/dvbplayer.c
---- vdr-2.6.1.orig/dvbplayer.c 2022-02-02 10:56:43.000000000 +0100
-+++ vdr-2.6.1/dvbplayer.c      2022-02-06 18:05:26.452890690 +0100
-@@ -249,13 +249,14 @@
-   cUnbufferedFile *replayFile;
-   double framesPerSecond;
-   bool isPesRecording;
--  bool pauseLive;
-+  ReplayState replayState;
-   bool eof;
-   bool firstPacket;
-   ePlayModes playMode;
-   ePlayDirs playDir;
-   int trickSpeed;
-   int readIndex;
-+  int startIndex;
-   bool readIndependent;
-   cFrame *readFrame;
-   cFrame *playFrame;
-@@ -271,6 +272,8 @@
-   virtual void Action(void);
- public:
-   cDvbPlayer(const char *FileName, bool PauseLive);
-+  cDvbPlayer(const char *FileName, ReplayState newReplayState);
-+  void Construct(const char *FileName, ReplayState newReplayState);
-   virtual ~cDvbPlayer();
-   void SetMarks(const cMarks *Marks);
-   bool Active(void) { return cThread::Running(); }
-@@ -297,6 +300,17 @@
- cDvbPlayer::cDvbPlayer(const char *FileName, bool PauseLive)
- :cThread("dvbplayer")
- {
-+  Construct(FileName, PauseLive? restPauseLive : restNormal);
-+}
-+
-+cDvbPlayer::cDvbPlayer(const char *FileName, ReplayState newReplayState)
-+:cThread("dvbplayer")
-+{
-+  Construct(FileName, newReplayState);
-+}
-+
-+void cDvbPlayer::Construct(const char *FileName, ReplayState newReplayState)
-+{  
-   nonBlockingFileReader = NULL;
-   ringBuffer = NULL;
-   marks = NULL;
-@@ -304,7 +318,8 @@
-   cRecording Recording(FileName);
-   framesPerSecond = Recording.FramesPerSecond();
-   isPesRecording = Recording.IsPesRecording();
--  pauseLive = PauseLive;
-+  replayState = newReplayState;
-+  bool reuse = (replayState == restReusePause || replayState == 
restReuseRewind);
-   eof = false;
-   firstPacket = true;
-   playMode = pmPlay;
-@@ -323,15 +338,21 @@
-      return;
-   ringBuffer = new cRingBufferFrame(PLAYERBUFSIZE);
-   // Create the index file:
--  index = new cIndexFile(FileName, false, isPesRecording, pauseLive);
-+  index = new cIndexFile(FileName, false, isPesRecording, replayState == 
restPauseLive);
-   if (!index)
-      esyslog("ERROR: can't allocate index");
-   else if (!index->Ok()) {
-      delete index;
-      index = NULL;
-      }
--  else if (PauseLive)
-+  else if (reuse)
-      framesPerSecond = cRecording(FileName).FramesPerSecond(); // the fps 
rate might have changed from the default
-+  startIndex = 0;
-+  if (replayState == restReuseRewind || replayState == restReusePause) {
-+     int Current, Total;
-+     GetIndex(Current, Total, false);
-+     startIndex = max(Total - 1, 0);
-+     }     
- }
- 
- cDvbPlayer::~cDvbPlayer()
-@@ -481,8 +502,21 @@
-   bool CutIn = false;
-   bool AtLastMark = false;
- 
--  if (pauseLive)
--     Goto(0, true);
-+  if (replayState == restPauseLive) {
-+    Goto(0, true);
-+    }
-+  else if (replayState == restReuseRewind || replayState == restReusePause) {
-+    readIndex = startIndex;
-+    Goto(readIndex, true);
-+    playMode = pmPlay;
-+    if (replayState == restReuseRewind) {
-+      Backward();
-+        }
-+    else if (replayState == restReusePause) {
-+      Pause();
-+        }
-+    }
-+  
-   while (Running()) {
-         if (WaitingForData)
-            WaitingForData = !nonBlockingFileReader->WaitForDataMs(3); // this 
keeps the CPU load low, but reacts immediately on new data
-@@ -985,6 +1019,11 @@
- {
- }
- 
-+cDvbPlayerControl::cDvbPlayerControl(const char *FileName, ReplayState 
replayState)
-+:cControl(player = new cDvbPlayer(FileName, replayState))
-+{
-+}
-+
- cDvbPlayerControl::~cDvbPlayerControl()
- {
-   Stop();
-diff -Naur vdr-2.6.1.orig/dvbplayer.h vdr-2.6.1/dvbplayer.h
---- vdr-2.6.1.orig/dvbplayer.h 2022-02-02 10:56:43.000000000 +0100
-+++ vdr-2.6.1/dvbplayer.h      2022-02-06 18:05:26.452890690 +0100
-@@ -16,6 +16,14 @@
- 
- class cDvbPlayer;
- 
-+enum ReplayState
-+{
-+      restNormal,
-+      restPauseLive,
-+      restReusePause,
-+      restReuseRewind
-+};
-+
- class cDvbPlayerControl : public cControl {
- private:
-   cDvbPlayer *player;
-@@ -25,6 +33,8 @@
-        // If PauseLive is true, special care is taken to make sure the index
-        // file of the recording is long enough to allow the player to display
-        // the first frame in still picture mode.
-+  cDvbPlayerControl(const char *FileName, ReplayState replayState);
-+       // Sets up a player for the given file. replayState represents the 
initial state.
-   virtual ~cDvbPlayerControl();
-   void SetMarks(const cMarks *Marks);
-   bool Active(void);
-diff -Naur vdr-2.6.1.orig/menu.c vdr-2.6.1/menu.c
---- vdr-2.6.1.orig/menu.c      2022-02-02 10:56:43.000000000 +0100
-+++ vdr-2.6.1/menu.c   2022-02-06 18:05:26.452890690 +0100
-@@ -5303,6 +5303,16 @@
- 
- cRecordControl::cRecordControl(cDevice *Device, cTimers *Timers, cTimer 
*Timer, bool Pause)
- {
-+  Construct(Device, Timers, Timer, Pause, NULL);
-+}
-+
-+cRecordControl::cRecordControl(cDevice *Device, cTimers *Timers, cTimer 
*Timer, bool Pause, bool* reused)
-+{
-+  Construct(Device, Timers, Timer, Pause, reused);
-+}
-+
-+void cRecordControl::Construct(cDevice *Device, cTimers *Timers, cTimer 
*Timer, bool Pause, bool* reused)
-+{
-   const char *LastReplayed = cReplayControl::LastReplayed(); // must do this 
before locking schedules!
-   // Whatever happens here, the timers will be modified in some way...
-   Timers->SetModified();
-@@ -5331,6 +5341,7 @@
-   timer->SetPending(true);
-   timer->SetRecording(true);
-   event = timer->Event();
-+  if (reused != NULL) *reused = false;
- 
-   if (event || GetEvent())
-      dsyslog("Title: '%s' Subtitle: '%s'", event->Title(), 
event->ShortText());
-@@ -5360,8 +5371,21 @@
-   if (MakeDirs(fileName, true)) {
-      Recording.WriteInfo(); // we write this *before* attaching the recorder 
to the device, to make sure the info file is present when the recorder needs to 
update the fps value!
-      const cChannel *ch = timer->Channel();
--     recorder = new cRecorder(fileName, ch, timer->Priority());
--     if (device->AttachReceiver(recorder)) {
-+
-+     if (!Timer) {
-+        recorder = device->GetPreRecording(ch);
-+        if (recorder != NULL) {
-+           recorder->ActivatePreRecording(fileName, timer->Priority());
-+           if (reused != NULL) *reused = true;
-+           }
-+        }
-+
-+     if (recorder == NULL) {
-+        recorder = new cRecorder(fileName, ch, timer->Priority());
-+        if (!device->AttachReceiver(recorder)) DELETENULL(recorder);
-+        }
-+
-+     if (recorder != NULL) {
-         cStatus::MsgRecording(device, Recording.Name(), Recording.FileName(), 
true);
-         if (!Timer && !LastReplayed) // an instant recording, maybe from 
cRecordControls::PauseLiveVideo()
-            cReplayControl::SetRecording(fileName);
-@@ -5371,8 +5395,6 @@
-         Recordings->AddByName(fileName);
-         return;
-         }
--     else
--        DELETENULL(recorder);
-      }
-   else
-      timer->SetDeferred(DEFERTIMER);
-@@ -5452,7 +5474,7 @@
- cRecordControl *cRecordControls::RecordControls[MAXRECORDCONTROLS] = { NULL };
- int cRecordControls::state = 0;
- 
--bool cRecordControls::Start(cTimers *Timers, cTimer *Timer, bool Pause)
-+bool cRecordControls::Start(cTimers *Timers, cTimer *Timer, bool Pause, bool* 
reused)
- {
-   static time_t LastNoDiskSpaceMessage = 0;
-   int FreeMB = 0;
-@@ -5490,7 +5512,7 @@
-         if (!Timer || Timer->Matches()) {
-            for (int i = 0; i < MAXRECORDCONTROLS; i++) {
-                if (!RecordControls[i]) {
--                  RecordControls[i] = new cRecordControl(device, Timers, 
Timer, Pause);
-+                  RecordControls[i] = new cRecordControl(device, Timers, 
Timer, Pause, reused);
-                   return RecordControls[i]->Process(time(NULL));
-                   }
-                }
-@@ -5514,6 +5536,11 @@
-   return Start(Timers, NULL, Pause);
- }
- 
-+bool cRecordControls::Start(cTimers *Timers, cTimer *Timer, bool Pause)
-+{
-+  return Start(Timers, Timer, Pause, NULL);
-+}
-+
- void cRecordControls::Stop(const char *InstantId)
- {
-   LOCK_TIMERS_WRITE;
-@@ -5549,10 +5576,17 @@
- 
- bool cRecordControls::PauseLiveVideo(void)
- {
-+  return PauseLiveVideo(false);
-+}
-+
-+bool cRecordControls::PauseLiveVideo(bool rewind)
-+{
-   Skins.Message(mtStatus, tr("Pausing live video..."));
-+  bool reused = false;  
-   cReplayControl::SetRecording(NULL); // make sure the new cRecordControl 
will set cReplayControl::LastReplayed()
--  if (Start(true)) {
--     cReplayControl *rc = new cReplayControl(true);
-+  LOCK_TIMERS_WRITE;
-+  if (Start(Timers, NULL, true, &reused)) {
-+     cReplayControl *rc = new cReplayControl(rewind? restReuseRewind : 
reused? restReusePause : restPauseLive);
-      cControl::Launch(rc);
-      cControl::Attach();
-      Skins.Message(mtStatus, NULL);
-@@ -5695,7 +5729,18 @@
- cReplayControl::cReplayControl(bool PauseLive)
- :cDvbPlayerControl(fileName, PauseLive)
- {
--  cDevice::PrimaryDevice()->SetKeepTracks(PauseLive);
-+  Construct(PauseLive? restPauseLive : restNormal);
-+}
-+
-+cReplayControl::cReplayControl(ReplayState replayState)
-+:cDvbPlayerControl(fileName, replayState)
-+{
-+  Construct(replayState);
-+}
-+
-+void cReplayControl::Construct(ReplayState replayState)
-+{
-+  cDevice::PrimaryDevice()->SetKeepTracks(replayState == restPauseLive);
-   currentReplayControl = this;
-   displayReplay = NULL;
-   marksModified = false;
-diff -Naur vdr-2.6.1.orig/menu.h vdr-2.6.1/menu.h
---- vdr-2.6.1.orig/menu.h      2022-02-02 10:56:43.000000000 +0100
-+++ vdr-2.6.1/menu.h   2022-02-06 18:05:26.452890690 +0100
-@@ -246,6 +246,8 @@
-   bool GetEvent(void);
- public:
-   cRecordControl(cDevice *Device, cTimers *Timers, cTimer *Timer = NULL, bool 
Pause = false);
-+  cRecordControl(cDevice *Device, cTimers *Timers, cTimer *Timer, bool Pause, 
bool* reused);
-+  void Construct(cDevice *Device, cTimers *Timers, cTimer *Timer, bool Pause, 
bool* reused);
-   virtual ~cRecordControl();
-   bool Process(time_t t);
-   cDevice *Device(void) { return device; }
-@@ -261,10 +263,12 @@
-   static int state;
- public:
-   static bool Start(cTimers *Timers, cTimer *Timer, bool Pause = false);
-+  static bool Start(cTimers *Timers, cTimer *Timer, bool Pause, bool* reused);
-   static bool Start(bool Pause = false);
-   static void Stop(const char *InstantId);
-   static void Stop(cTimer *Timer);
-   static bool PauseLiveVideo(void);
-+  static bool PauseLiveVideo(bool rewind);
-   static const char *GetInstantId(const char *LastInstantId);
-   static cRecordControl *GetRecordControl(const char *FileName);
-   static cRecordControl *GetRecordControl(const cTimer *Timer);
-@@ -320,6 +324,8 @@
-   void EditTest(void);
- public:
-   cReplayControl(bool PauseLive = false);
-+  cReplayControl(ReplayState replayState);
-+  void Construct(ReplayState replayState);
-   virtual ~cReplayControl();
-   void Stop(void);
-   virtual cOsdObject *GetInfo(void);
-diff -Naur vdr-2.6.1.orig/receiver.h vdr-2.6.1/receiver.h
---- vdr-2.6.1.orig/receiver.h  2022-02-02 10:56:43.000000000 +0100
-+++ vdr-2.6.1/receiver.h       2022-02-06 18:05:26.452890690 +0100
-@@ -85,6 +85,10 @@
-                ///< case the device is needed otherwise, so code that uses a 
cReceiver
-                ///< should repeatedly check whether it is still attached, and 
if
-                ///< it isn't, delete it (or take any other appropriate 
measures).
-+  virtual bool IsPreRecording(const cChannel *Channel) { return false; }
-+               ///< prerecords given channel; may be turned into a disc 
recording.
-+  virtual bool ActivatePreRecording(const char* fileName, int Priority) { 
return false; }
-+                         ///< turn prerecording into a disc recording
-   };
- 
- #endif //__RECEIVER_H
-diff -Naur vdr-2.6.1.orig/recorder.c vdr-2.6.1/recorder.c
---- vdr-2.6.1.orig/recorder.c  2022-02-02 10:56:43.000000000 +0100
-+++ vdr-2.6.1/recorder.c       2022-02-06 18:05:26.452890690 +0100
-@@ -164,11 +164,25 @@
- cRecorder::cRecorder(const char *FileName, const cChannel *Channel, int 
Priority)
- :cReceiver(Channel, Priority)
- ,cThread("recording")
-+,tsChecker(NULL), frameChecker(NULL), recordingInfo(NULL), ringBuffer(NULL), 
frameDetector(NULL), fileName(NULL), index(NULL), recordFile(NULL), 
recordingName(NULL)
- {
--  tsChecker = new cTsChecker;
--  frameChecker = new cFrameChecker;
-+  if (FileName != NULL) {
-+     InitializeFile(FileName, Channel);
-+     }
-+}
-+
-+void cRecorder::InitializeFile(const char *FileName, const cChannel *Channel)
-+{
-+  if (tsChecker == NULL) {
-+     tsChecker = new cTsChecker;
-+     }
-+  if (frameChecker == NULL) {
-+     frameChecker = new cFrameChecker;
-+     }
-   recordingName = strdup(FileName);
--  recordingInfo = new cRecordingInfo(recordingName);
-+  if (recordingInfo == NULL) {
-+     recordingInfo = new cRecordingInfo(recordingName);
-+     }
-   recordingInfo->Read();
-   oldErrors = max(0, recordingInfo->Errors()); // in case this is a 
re-started recording
-   errors = oldErrors;
-@@ -193,7 +207,9 @@
-      Pid = Channel->Dpid(0);
-      Type = 0x06;
-      }
--  frameDetector = new cFrameDetector(Pid, Type);
-+  if (frameDetector == NULL) {
-+     frameDetector = new cFrameDetector(Pid, Type);
-+     }
-   index = NULL;
-   fileSize = 0;
-   lastDiskSpaceCheck = time(NULL);
-diff -Naur vdr-2.6.1.orig/recorder.h vdr-2.6.1/recorder.h
---- vdr-2.6.1.orig/recorder.h  2022-02-02 10:56:43.000000000 +0100
-+++ vdr-2.6.1/recorder.h       2022-02-06 18:05:26.452890690 +0100
-@@ -19,8 +19,8 @@
- class cTsChecker;
- class cFrameChecker;
- 
--class cRecorder : public cReceiver, cThread {
--private:
-+class cRecorder : public cReceiver, protected cThread {
-+protected:
-   cTsChecker *tsChecker;
-   cFrameChecker *frameChecker;
-   cRingBufferLinear *ringBuffer;
-@@ -41,7 +41,6 @@
-   bool RunningLowOnDiskSpace(void);
-   bool NextFile(void);
-   void HandleErrors(bool Force = false);
--protected:
-   virtual void Activate(bool On);
-        ///< If you override Activate() you need to call Detach() (which is a
-        ///< member of the cReceiver class) from your own destructor in order
-@@ -49,6 +48,9 @@
-        ///< destroyed.
-   virtual void Receive(const uchar *Data, int Length);
-   virtual void Action(void);
-+  void InitializeFile(const char *FileName, const cChannel *Channel);
-+       ///< Starts recording to file.
-+       ///< Called in constructor if file name has been given.
- public:
-   cRecorder(const char *FileName, const cChannel *Channel, int Priority);
-        ///< Creates a new recorder for the given Channel and
-diff -Naur vdr-2.6.1.orig/ringbuffer.c vdr-2.6.1/ringbuffer.c
---- vdr-2.6.1.orig/ringbuffer.c        2022-02-02 10:56:43.000000000 +0100
-+++ vdr-2.6.1/ringbuffer.c     2022-02-06 18:05:26.452890690 +0100
-@@ -368,6 +368,25 @@
-   return NULL;
- }
- 
-+uchar *cRingBufferLinear::GetRest(int &Count)
-+{
-+  int Head = head;
-+  if (getThreadTid <= 0)
-+     getThreadTid = cThread::ThreadId();
-+  int rest = Size() - tail;
-+  int diff = Head - tail;
-+  int cont = (diff >= 0) ? diff : Size() + diff - margin;
-+  if (cont > rest)
-+     cont = rest;
-+  uchar *p = buffer + tail;
-+  if (cont > 0) {
-+     Count = gotten = cont;
-+     return p;
-+     }
-+  WaitForGet();
-+  return NULL;
-+}
-+
- void cRingBufferLinear::Del(int Count)
- {
-   if (Count > gotten) {
-diff -Naur vdr-2.6.1.orig/ringbuffer.h vdr-2.6.1/ringbuffer.h
---- vdr-2.6.1.orig/ringbuffer.h        2022-02-02 10:56:43.000000000 +0100
-+++ vdr-2.6.1/ringbuffer.h     2022-02-06 18:05:26.452890690 +0100
-@@ -98,6 +98,12 @@
-     ///< The data will remain in the buffer until a call to Del() deletes it.
-     ///< Returns a pointer to the data, and stores the number of bytes
-     ///< actually available in Count. If the returned pointer is NULL, Count 
has no meaning.
-+  uchar *GetRest(int &Count);
-+  ///< Gets data from the ring buffer disregarding the margin.
-+  ///< Might have to be called several times to get all data.
-+  ///< The data will remain in the buffer until a call to Del() deletes it.
-+  ///< Returns a pointer to the data, and stores the number of bytes
-+  ///< actually available in Count. If the returned pointer is NULL, Count 
has no meaning.
-   void Del(int Count);
-     ///< Deletes at most Count bytes from the ring buffer.
-     ///< Count must be less or equal to the number that was returned by a 
previous
-diff -Naur vdr-2.6.1.orig/vdr.c vdr-2.6.1/vdr.c
---- vdr-2.6.1.orig/vdr.c       2022-02-02 10:56:43.000000000 +0100
-+++ vdr-2.6.1/vdr.c    2022-02-06 18:05:26.452890690 +0100
-@@ -1352,13 +1352,22 @@
-                key = kNone;
-                break;
-           // Pausing live video:
-+          case kFastRew:
-+               {
-+               // test if there's a live buffer to rewind into...
-+               LOCK_CHANNELS_READ;
-+               if 
(cDevice::ActualDevice()->GetPreRecording(Channels->GetByNumber(cDevice::CurrentChannel()))
 == NULL) {
-+                  break;
-+                  }
-+               }
-+               // fall through to pause
-           case kPlayPause:
-           case kPause:
-                if (!Control) {
-                   DELETE_MENU;
-                   if (Setup.PauseKeyHandling) {
-                      if (Setup.PauseKeyHandling > 1 || 
Interface->Confirm(tr("Pause live video?"))) {
--                        if (!cRecordControls::PauseLiveVideo())
-+                        if (!cRecordControls::PauseLiveVideo(int(key) == 
kFastRew))
-                            Skins.QueueMessage(mtError, tr("No free DVB device 
to record!"));
-                         }
-                      }

diff --git a/media-video/vdr/files/vdr-2.6.1_naludump.patch 
b/media-video/vdr/files/vdr-2.6.1_naludump.patch
deleted file mode 100644
index efea3a1d74f7..000000000000
--- a/media-video/vdr/files/vdr-2.6.1_naludump.patch
+++ /dev/null
@@ -1,598 +0,0 @@
-diff -a -U 2 -r a/config.c b/config.c
---- a/config.c
-+++ b/config.c
-@@ -469,4 +469,5 @@
-   SplitEditedFiles = 0;
-   DelTimeshiftRec = 0;
-+  DumpNaluFill = 0;
-   MinEventTimeout = 30;
-   MinUserInactivity = 300;
-@@ -697,4 +698,5 @@
-   else if (!strcasecmp(Name, "SplitEditedFiles"))    SplitEditedFiles   = 
atoi(Value);
-   else if (!strcasecmp(Name, "DelTimeshiftRec"))     DelTimeshiftRec    = 
atoi(Value);
-+  else if (!strcasecmp(Name, "DumpNaluFill"))        DumpNaluFill       = 
atoi(Value);
-   else if (!strcasecmp(Name, "MinEventTimeout"))     MinEventTimeout    = 
atoi(Value);
-   else if (!strcasecmp(Name, "MinUserInactivity"))   MinUserInactivity  = 
atoi(Value);
-@@ -829,4 +831,5 @@
-   Store("SplitEditedFiles",   SplitEditedFiles);
-   Store("DelTimeshiftRec",    DelTimeshiftRec);
-+  Store("DumpNaluFill",       DumpNaluFill);
-   Store("MinEventTimeout",    MinEventTimeout);
-   Store("MinUserInactivity",  MinUserInactivity);
-diff -a -U 2 -r a/config.h b/config.h
---- a/config.h
-+++ b/config.h
-@@ -341,4 +341,5 @@
-   int SplitEditedFiles;
-   int DelTimeshiftRec;
-+  int DumpNaluFill;
-   int MinEventTimeout, MinUserInactivity;
-   time_t NextWakeupTime;
-diff -a -U 2 -r a/menu.c b/menu.c
---- a/menu.c
-+++ b/menu.c
-@@ -4185,4 +4185,5 @@
-   Add(new cMenuEditBoolItem(tr("Setup.Recording$Split edited files"),        
&data.SplitEditedFiles));
-   Add(new cMenuEditStraItem(tr("Setup.Recording$Delete timeshift 
recording"),&data.DelTimeshiftRec, 3, delTimeshiftRecTexts));
-+  Add(new cMenuEditBoolItem(tr("Setup.Recording$Dump NALU Fill data"),       
&data.DumpNaluFill));
- }
- 
-diff -a -U 2 -r a/recorder.c b/recorder.c
---- a/recorder.c
-+++ b/recorder.c
-@@ -195,4 +195,12 @@
-      }
-   frameDetector = new cFrameDetector(Pid, Type);
-+  if (   Type == 0x1B // MPEG4 video
-+      && (Setup.DumpNaluFill ? (strstr(FileName, "NALUKEEP") == NULL) : 
(strstr(FileName, "NALUDUMP") != NULL))) { // MPEG4
-+     isyslog("Starting NALU fill dumper");
-+     naluStreamProcessor = new cNaluStreamProcessor();
-+     naluStreamProcessor->SetPid(Pid);
-+     }
-+  else
-+     naluStreamProcessor = NULL;
-   index = NULL;
-   fileSize = 0;
-@@ -217,4 +225,10 @@
- {
-   Detach();
-+  if (naluStreamProcessor) {
-+     long long int TotalPackets = naluStreamProcessor->GetTotalPackets();
-+     long long int DroppedPackets = naluStreamProcessor->GetDroppedPackets();
-+     isyslog("NALU fill dumper: %lld of %lld packets dropped, %lli%%", 
DroppedPackets, TotalPackets, TotalPackets ? DroppedPackets*100/TotalPackets : 
0);
-+     delete naluStreamProcessor;
-+     }
-   delete index;
-   delete fileName;
-@@ -357,10 +371,32 @@
-                        t.Set(MAXBROKENTIMEOUT);
-                        }
--                    if (recordFile->Write(b, Count) < 0) {
--                       LOG_ERROR_STR(fileName->Name());
--                       break;
-+                  if (naluStreamProcessor) {
-+                       naluStreamProcessor->PutBuffer(b, Count);
-+                       bool Fail = false;
-+                       while (true) {
-+                             int OutLength = 0;
-+                             uchar *OutData = 
naluStreamProcessor->GetBuffer(OutLength);
-+                             if (!OutData || OutLength <= 0)
-+                                break;
-+                             if (recordFile->Write(OutData, OutLength) < 0) {
-+                                LOG_ERROR_STR(fileName->Name());
-+                                Fail = true;
-+                                break;
-+                                }
-+                             HandleErrors();
-+                             fileSize += OutLength;
-+                             }
-+                       if (Fail)
-+                          break;
-+                       }
-+                    else {
-+                       if (recordFile->Write(b, Count) < 0) {
-+                          LOG_ERROR_STR(fileName->Name());
-+                          break;
-+                          }
-+                       HandleErrors();
-+                       fileSize += Count;
-                        }
--                    HandleErrors();
--                    fileSize += Count;
-+
-                     }
-                  }
-diff -a -U 2 -r a/recorder.h b/recorder.h
---- a/recorder.h
-+++ b/recorder.h       C2022-01-08 17:51:00.397595525 +0100
-@@ -27,4 +27,5 @@
-   cFrameDetector *frameDetector;
-   cPatPmtGenerator patPmtGenerator;
-+  cNaluStreamProcessor *naluStreamProcessor;
-   cFileName *fileName;
-   cRecordingInfo *recordingInfo;
-diff -a -U 2 -r a/remux.c b/remux.c
---- a/remux.c
-+++ b/remux.c
-@@ -357,4 +357,40 @@
- }
- 
-+void TsExtendAdaptionField(unsigned char *Packet, int ToLength)
-+{
-+    // Hint: ExtenAdaptionField(p, TsPayloadOffset(p) - 4) is a null operation
-+
-+    int Offset = TsPayloadOffset(Packet); // First byte after existing 
adaption field
-+
-+    if (ToLength <= 0)
-+    {
-+        // Remove adaption field
-+        Packet[3] = Packet[3] & ~TS_ADAPT_FIELD_EXISTS;
-+        return;
-+    }
-+
-+    // Set adaption field present
-+    Packet[3] = Packet[3] | TS_ADAPT_FIELD_EXISTS;
-+
-+    // Set new length of adaption field:
-+    Packet[4] = ToLength <= TS_SIZE-4 ? ToLength-1 : TS_SIZE-4-1;
-+
-+    if (Packet[4] == TS_SIZE-4-1)
-+    {
-+        // No more payload, remove payload flag
-+        Packet[3] = Packet[3] & ~TS_PAYLOAD_EXISTS;
-+    }
-+
-+    int NewPayload = TsPayloadOffset(Packet); // First byte after new 
adaption field
-+
-+    // Fill new adaption field
-+    if (Offset == 4 && Offset < NewPayload)
-+        Offset++; // skip adaptation_field_length
-+    if (Offset == 5 && Offset < NewPayload)
-+        Packet[Offset++] = 0; // various flags set to 0
-+    while (Offset < NewPayload)
-+        Packet[Offset++] = 0xff; // stuffing byte
-+}
-+
- // --- cPatPmtGenerator ------------------------------------------------------
- 
-@@ -1765,2 +1801,343 @@
-   return Processed;
- }
-+
-+// --- cNaluDumper ---------------------------------------------------------
-+
-+cNaluDumper::cNaluDumper()
-+{
-+    LastContinuityOutput = -1;
-+    reset();
-+}
-+
-+void cNaluDumper::reset()
-+{
-+    LastContinuityInput = -1;
-+    ContinuityOffset = 0;
-+    PesId = -1;
-+    PesOffset = 0;
-+    NaluFillState = NALU_NONE;
-+    NaluOffset = 0;
-+    History = 0xffffffff;
-+    DropAllPayload = false;
-+}
-+
-+void cNaluDumper::ProcessPayload(unsigned char *Payload, int size, bool 
PayloadStart, sPayloadInfo &Info)
-+{
-+    Info.DropPayloadStartBytes = 0;
-+    Info.DropPayloadEndBytes = 0;
-+    int LastKeepByte = -1;
-+
-+    if (PayloadStart)
-+    {
-+        History = 0xffffffff;
-+        PesId = -1;
-+        NaluFillState = NALU_NONE;
-+    }
-+
-+    for (int i=0; i<size; i++) {
-+        History = (History << 8) | Payload[i];
-+
-+        PesOffset++;
-+        NaluOffset++;
-+
-+        bool DropByte = false;
-+
-+        if (History >= 0x00000180 && History <= 0x000001FF)
-+        {
-+            // Start of PES packet
-+            PesId = History & 0xff;
-+            PesOffset = 0;
-+            NaluFillState = NALU_NONE;
-+        }
-+        else if (PesId >= 0xe0 && PesId <= 0xef // video stream
-+                 && History >= 0x00000100 && History <= 0x0000017F) // NALU 
start code
-+        {
-+            int NaluId = History & 0xff;
-+            NaluOffset = 0;
-+            NaluFillState = ((NaluId & 0x1f) == 0x0c) ? NALU_FILL : NALU_NONE;
-+        }
-+
-+        if (PesId >= 0xe0 && PesId <= 0xef // video stream
-+            && PesOffset >= 1 && PesOffset <= 2)
-+        {
-+            Payload[i] = 0; // Zero out PES length field
-+        }
-+
-+        if (NaluFillState == NALU_FILL && NaluOffset > 0) // Within NALU fill 
data
-+        {
-+            // We expect a series of 0xff bytes terminated by a single 0x80 
byte.
-+
-+            if (Payload[i] == 0xFF)
-+            {
-+                DropByte = true;
-+            }
-+            else if (Payload[i] == 0x80)
-+            {
-+                NaluFillState = NALU_TERM; // Last byte of NALU fill, next 
byte sets NaluFillEnd=true
-+                DropByte = true;
-+            }
-+            else // Invalid NALU fill
-+            {
-+                dsyslog("cNaluDumper: Unexpected NALU fill data: %02x", 
Payload[i]);
-+                NaluFillState = NALU_END;
-+                if (LastKeepByte == -1)
-+                {
-+                    // Nalu fill from beginning of packet until last byte
-+                    // packet start needs to be dropped
-+                    Info.DropPayloadStartBytes = i;
-+                }
-+            }
-+        }
-+        else if (NaluFillState == NALU_TERM) // Within NALU fill data
-+        {
-+            // We are after the terminating 0x80 byte
-+            NaluFillState = NALU_END;
-+            if (LastKeepByte == -1)
-+            {
-+                // Nalu fill from beginning of packet until last byte
-+                // packet start needs to be dropped
-+                Info.DropPayloadStartBytes = i;
-+            }
-+        }
-+
-+        if (!DropByte)
-+            LastKeepByte = i; // Last useful byte
-+    }
-+
-+    Info.DropAllPayloadBytes = (LastKeepByte == -1);
-+    Info.DropPayloadEndBytes = size-1-LastKeepByte;
-+}
-+
-+bool cNaluDumper::ProcessTSPacket(unsigned char *Packet)
-+{
-+    bool HasAdaption = TsHasAdaptationField(Packet);
-+    bool HasPayload = TsHasPayload(Packet);
-+
-+    // Check continuity:
-+    int ContinuityInput = TsContinuityCounter(Packet);
-+    if (LastContinuityInput >= 0)
-+    {
-+        int NewContinuityInput = HasPayload ? (LastContinuityInput + 1) & 
TS_CONT_CNT_MASK : LastContinuityInput;
-+        int Offset = (NewContinuityInput - ContinuityInput) & 
TS_CONT_CNT_MASK;
-+        if (Offset > 0)
-+            dsyslog("cNaluDumper: TS continuity offset %i", Offset);
-+        if (Offset > ContinuityOffset)
-+            ContinuityOffset = Offset; // max if packets get dropped, 
otherwise always the current one.
-+    }
-+    LastContinuityInput = ContinuityInput;
-+
-+    if (HasPayload) {
-+        sPayloadInfo Info;
-+        int Offset = TsPayloadOffset(Packet);
-+        ProcessPayload(Packet + Offset, TS_SIZE - Offset, 
TsPayloadStart(Packet), Info);
-+
-+        if (DropAllPayload && !Info.DropAllPayloadBytes)
-+        {
-+            // Return from drop packet mode to normal mode
-+            DropAllPayload = false;
-+
-+            // Does the packet start with some remaining NALU fill data?
-+            if (Info.DropPayloadStartBytes > 0)
-+            {
-+                // Add these bytes as stuffing to the adaption field.
-+
-+                // Sample payload layout:
-+                // FF FF FF FF FF 80 00 00 01 xx xx xx xx
-+                //                   ^DropPayloadStartBytes
-+
-+                TsExtendAdaptionField(Packet, Offset - 4 + 
Info.DropPayloadStartBytes);
-+            }
-+        }
-+
-+        bool DropThisPayload = DropAllPayload;
-+
-+        if (!DropAllPayload && Info.DropPayloadEndBytes > 0) // Payload ends 
with 0xff NALU Fill
-+        {
-+            // Last packet of useful data
-+            // Do early termination of NALU fill data
-+            Packet[TS_SIZE-1] = 0x80;
-+            DropAllPayload = true;
-+            // Drop all packets AFTER this one
-+
-+            // Since we already wrote the 0x80, we have to make sure that
-+            // as soon as we stop dropping packets, any beginning NALU fill 
of next
-+            // packet gets dumped. (see DropPayloadStartBytes above)
-+        }
-+
-+        if (DropThisPayload && HasAdaption)
-+        {
-+            // Drop payload data, but keep adaption field data
-+            TsExtendAdaptionField(Packet, TS_SIZE-4);
-+            DropThisPayload = false;
-+        }
-+
-+        if (DropThisPayload)
-+        {
-+            return true; // Drop packet
-+        }
-+    }
-+
-+    // Fix Continuity Counter and reproduce incoming offsets:
-+    int NewContinuityOutput = TsHasPayload(Packet) ? (LastContinuityOutput + 
1) & TS_CONT_CNT_MASK : LastContinuityOutput;
-+    NewContinuityOutput = (NewContinuityOutput + ContinuityOffset) & 
TS_CONT_CNT_MASK;
-+    TsSetContinuityCounter(Packet, NewContinuityOutput);
-+    LastContinuityOutput = NewContinuityOutput;
-+    ContinuityOffset = 0;
-+
-+    return false; // Keep packet
-+}
-+
-+// --- cNaluStreamProcessor 
---------------------------------------------------------
-+
-+cNaluStreamProcessor::cNaluStreamProcessor()
-+{
-+    pPatPmtParser = NULL;
-+    vpid = -1;
-+    data = NULL;
-+    length = 0;
-+    tempLength = 0;
-+    tempLengthAtEnd = false;
-+    TotalPackets = 0;
-+    DroppedPackets = 0;
-+}
-+
-+void cNaluStreamProcessor::PutBuffer(uchar *Data, int Length)
-+{
-+    if (length > 0)
-+        esyslog("cNaluStreamProcessor::PutBuffer: New data before old data 
was processed!");
-+
-+    data = Data;
-+    length = Length;
-+}
-+
-+uchar* cNaluStreamProcessor::GetBuffer(int &OutLength)
-+{
-+    if (length <= 0)
-+    {
-+        // Need more data - quick exit
-+        OutLength = 0;
-+        return NULL;
-+    }
-+    if (tempLength > 0) // Data in temp buffer?
-+    {
-+        if (tempLengthAtEnd) // Data is at end, copy to beginning
-+        {
-+            // Overlapping src and dst!
-+            for (int i=0; i<tempLength; i++)
-+                tempBuffer[i] = tempBuffer[TS_SIZE-tempLength+i];
-+        }
-+        // Normalize TempBuffer fill
-+        if (tempLength < TS_SIZE && length > 0)
-+        {
-+            int Size = min(TS_SIZE-tempLength, length);
-+            memcpy(tempBuffer+tempLength, data, Size);
-+            data += Size;
-+            length -= Size;
-+            tempLength += Size;
-+        }
-+        if (tempLength < TS_SIZE)
-+        {
-+            // All incoming data buffered, but need more data
-+            tempLengthAtEnd = false;
-+            OutLength = 0;
-+            return NULL;
-+        }
-+        // Now: TempLength==TS_SIZE
-+        if (tempBuffer[0] != TS_SYNC_BYTE)
-+        {
-+            // Need to sync on TS within temp buffer
-+            int Skipped = 1;
-+            while (Skipped < TS_SIZE && (tempBuffer[Skipped] != TS_SYNC_BYTE 
|| (Skipped < length && data[Skipped] != TS_SYNC_BYTE)))
-+                Skipped++;
-+            esyslog("ERROR: skipped %d bytes to sync on start of TS packet", 
Skipped);
-+            // Pass through skipped bytes
-+            tempLengthAtEnd = true;
-+            tempLength = TS_SIZE - Skipped; // may be 0, thats ok
-+            OutLength = Skipped;
-+            return tempBuffer;
-+        }
-+        // Now: TempBuffer is a TS packet
-+        int Pid = TsPid(tempBuffer);
-+        if (pPatPmtParser)
-+        {
-+            if (Pid == 0)
-+                pPatPmtParser->ParsePat(tempBuffer, TS_SIZE);
-+            else if (pPatPmtParser->IsPmtPid(Pid))
-+                pPatPmtParser->ParsePmt(tempBuffer, TS_SIZE);
-+        }
-+
-+        TotalPackets++;
-+        bool Drop = false;
-+        if (Pid == vpid || (pPatPmtParser && Pid == pPatPmtParser->Vpid() && 
pPatPmtParser->Vtype() == 0x1B))
-+            Drop = NaluDumper.ProcessTSPacket(tempBuffer);
-+        if (!Drop)
-+        {
-+            // Keep this packet, then continue with new data
-+            tempLength = 0;
-+            OutLength = TS_SIZE;
-+            return tempBuffer;
-+        }
-+        // Drop TempBuffer
-+        DroppedPackets++;
-+        tempLength = 0;
-+    }
-+    // Now: TempLength==0, just process data/length
-+
-+    // Pointer to processed data / length:
-+    uchar *Out = data;
-+    uchar *OutEnd = Out;
-+
-+    while (length >= TS_SIZE)
-+    {
-+        if (data[0] != TS_SYNC_BYTE) {
-+            int Skipped = 1;
-+            while (Skipped < length && (data[Skipped] != TS_SYNC_BYTE || 
(length - Skipped > TS_SIZE && data[Skipped + TS_SIZE] != TS_SYNC_BYTE)))
-+                Skipped++;
-+            esyslog("ERROR: skipped %d bytes to sync on start of TS packet", 
Skipped);
-+
-+            // Pass through skipped bytes
-+            if (OutEnd != data)
-+                memcpy(OutEnd, data, Skipped);
-+            OutEnd += Skipped;
-+            continue;
-+        }
-+        // Now: Data starts with complete TS packet
-+
-+        int Pid = TsPid(data);
-+        if (pPatPmtParser)
-+        {
-+            if (Pid == 0)
-+                pPatPmtParser->ParsePat(data, TS_SIZE);
-+            else if (pPatPmtParser->IsPmtPid(Pid))
-+                pPatPmtParser->ParsePmt(data, TS_SIZE);
-+        }
-+
-+        TotalPackets++;
-+        bool Drop = false;
-+        if (Pid == vpid || (pPatPmtParser && Pid == pPatPmtParser->Vpid() && 
pPatPmtParser->Vtype() == 0x1B))
-+            Drop = NaluDumper.ProcessTSPacket(data);
-+        if (!Drop)
-+        {
-+            if (OutEnd != data)
-+                memcpy(OutEnd, data, TS_SIZE);
-+            OutEnd += TS_SIZE;
-+        }
-+        else
-+        {
-+            DroppedPackets++;
-+        }
-+        data += TS_SIZE;
-+        length -= TS_SIZE;
-+    }
-+    // Now: Less than a packet remains.
-+    if (length > 0)
-+    {
-+        // copy remains into temp buffer
-+        memcpy(tempBuffer, data, length);
-+        tempLength = length;
-+        tempLengthAtEnd = false;
-+        length = 0;
-+    }
-+    OutLength = (OutEnd - Out);
-+    return OutLength > 0 ? Out : NULL;
-+}
-diff -a -U 2 -r a/remux.h b/remux.h
---- a/remux.h
-+++ b/remux.h
-@@ -65,4 +65,9 @@
- }
- 
-+inline bool TsSetPayload(const uchar *p)
-+{
-+  return p[3] & TS_PAYLOAD_EXISTS;
-+}
-+
- inline bool TsHasAdaptationField(const uchar *p)
- {
-@@ -156,4 +161,5 @@
- void TsSetPts(uchar *p, int l, int64_t Pts);
- void TsSetDts(uchar *p, int l, int64_t Dts);
-+void TsExtendAdaptionField(unsigned char *Packet, int ToLength);
- 
- // Some PES handling tools:
-@@ -550,3 +556,77 @@
-   };
- 
-+
-+#define PATCH_NALUDUMP 100
-+
-+class cNaluDumper {
-+    unsigned int History;
-+
-+    int LastContinuityInput;
-+    int LastContinuityOutput;
-+    int ContinuityOffset;
-+
-+    bool DropAllPayload;
-+
-+    int PesId;
-+    int PesOffset;
-+
-+    int NaluOffset;
-+
-+    enum eNaluFillState {
-+        NALU_NONE=0,    // currently not NALU fill stream
-+        NALU_FILL,      // Within NALU fill stream, 0xff bytes and NALU start 
code in byte 0
-+        NALU_TERM,      // Within NALU fill stream, read 0x80 terminating byte
-+        NALU_END        // Beyond end of NALU fill stream, expecting 0x00 
0x00 0x01 now
-+        };
-+
-+    eNaluFillState NaluFillState;
-+
-+    struct sPayloadInfo {
-+        int DropPayloadStartBytes;
-+        int DropPayloadEndBytes;
-+        bool DropAllPayloadBytes;
-+    };
-+
-+public:
-+    cNaluDumper();
-+
-+    void reset();
-+
-+    // Single packet interface:
-+    bool ProcessTSPacket(unsigned char *Packet);
-+
-+private:
-+    void ProcessPayload(unsigned char *Payload, int size, bool PayloadStart, 
sPayloadInfo &Info);
-+};
-+
-+class cNaluStreamProcessor {
-+    //Buffer stream interface:
-+    int vpid;
-+    uchar *data;
-+    int length;
-+    uchar tempBuffer[TS_SIZE];
-+    int tempLength;
-+    bool tempLengthAtEnd;
-+    cPatPmtParser *pPatPmtParser;
-+    cNaluDumper NaluDumper;
-+
-+    long long int TotalPackets;
-+    long long int DroppedPackets;
-+public:
-+    cNaluStreamProcessor();
-+
-+    void SetPid(int VPid) { vpid = VPid; }
-+    void SetPatPmtParser(cPatPmtParser *_pPatPmtParser) { pPatPmtParser = 
_pPatPmtParser; }
-+    // Set either a PID or set a pointer to an PatPmtParser that will detect 
_one_ PID
-+
-+    void PutBuffer(uchar *Data, int Length);
-+    // Add new data to be processed. Data must be valid until Get() returns 
NULL.
-+    uchar* GetBuffer(int &OutLength);
-+    // Returns filtered data, or NULL/0 to indicate that all data from Put() 
was processed
-+    // or buffered.
-+
-+    long long int GetTotalPackets() { return TotalPackets; }
-+    long long int GetDroppedPackets() { return DroppedPackets; }
-+};
-+
- #endif // __REMUX_H

diff --git a/media-video/vdr/files/vdr-2.6.7_pinplugin.patch 
b/media-video/vdr/files/vdr-2.6.7_pinplugin.patch
deleted file mode 100644
index 281a3e2dbf5f..000000000000
--- a/media-video/vdr/files/vdr-2.6.7_pinplugin.patch
+++ /dev/null
@@ -1,447 +0,0 @@
-original vdr-pinplugin_vdr-2.3.1.diff
-rebased for media-video/vdr-2.6.7
-
-Signed-off-by: Christian Kunkel <[email protected]> ( 2021 Feb 12 )
-Reviewed-by: Martin Dummer <[email protected]> ( 2024-06-18 )
-diff -Naur vdr-2.6.7.orig/Makefile vdr-2.6.7/Makefile
---- vdr-2.6.7.orig/Makefile    2024-06-18 22:37:59.172119452 +0200
-+++ vdr-2.6.7/Makefile 2024-06-18 22:38:53.723925736 +0200
-@@ -356,7 +356,7 @@
- clean:
-       @$(MAKE) --no-print-directory -C $(LSIDIR) clean
-       @-rm -f $(OBJS) $(DEPFILE) vdr vdr.pc core* *~
--      @-rm -rf $(LOCALEDIR) $(PODIR)/*.mo $(PODIR)/*.pot
-+      @-rm -rf $(LOCALEDIR) $(PODIR)/*~ $(PODIR)/*.mo $(PODIR)/*.pot
-       @-rm -rf include
-       @-rm -rf srcdoc
- CLEAN: clean
-diff -Naur vdr-2.6.7.orig/device.c vdr-2.6.7/device.c
---- vdr-2.6.7.orig/device.c    2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/device.c 2024-06-18 22:38:53.727925721 +0200
-@@ -847,6 +847,7 @@
-      const cChannel *Channel;
-      while ((Channel = Channels->GetByNumber(n, Direction)) != NULL) {
-            // try only channels which are currently available
-+           if (!cStatus::MsgChannelProtected(0, Channel))      // PIN PATCH
-            if (GetDevice(Channel, LIVEPRIORITY, true, true))
-               break;
-            n = Channel->Number() + Direction;
-@@ -868,6 +869,12 @@
- 
- eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
- {
-+  // I hope 'LiveView = false' indicates a channel switch for recording, // 
PIN PATCH
-+  // I really don't know, but it works ...                               // 
PIN PATCH
-+
-+  if (LiveView && cStatus::MsgChannelProtected(this, Channel))           // 
PIN PATCH
-+     return scrNotAvailable;                                             // 
PIN PATCH
-+
-   cMutexLock MutexLock(&mutexChannel); // to avoid a race between SVDRP CHAN 
and HasProgramme()
-   cStatus::MsgChannelSwitch(this, 0, LiveView);
- 
-diff -Naur vdr-2.6.7.orig/menu.c vdr-2.6.7/menu.c
---- vdr-2.6.7.orig/menu.c      2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/menu.c   2024-06-18 22:38:53.727925721 +0200
-@@ -1035,6 +1035,18 @@
-      Add(new cMenuEditBitItem( tr("VPS"),          &data.flags, tfVps));
-      Add(new cMenuEditIntItem( tr("Priority"),     &data.priority, 0, 
MAXPRIORITY));
-      Add(new cMenuEditIntItem( tr("Lifetime"),     &data.lifetime, 0, 
MAXLIFETIME));
-+
-+     // PIN PATCH
-+     if (cOsd::pinValid || !data.fskProtection) Add(new 
cMenuEditBoolItem(tr("Childlock"),&data.fskProtection));
-+     else {
-+        char* buf = 0;
-+        int res = 0;
-+        res = asprintf(&buf, "%s\t%s", tr("Childlock"), data.fskProtection ? 
tr("yes") : tr("no"));
-+        if (res < 0) ; // memory problems :o
-+        Add(new cOsdItem(buf));
-+        free(buf);
-+        }
-+
-      Add(file = new cMenuEditStrItem( tr("File"),   data.file, 
sizeof(data.file)));
-      SetFirstDayItem();
-      SetPatternItem(true);
-@@ -3129,7 +3141,8 @@
-                       }
-                    }
-                }
--            if (*Item->Text() && !LastDir) {
-+            if (*Item->Text() && !LastDir
-+                && (!cStatus::MsgReplayProtected(Item->Recording(), 
Item->Name(), base, Item->IsDirectory(), true))) { // PIN PATCH
-                Add(Item);
-                LastItem = Item;
-                if (Item->IsDirectory())
-@@ -3200,6 +3213,9 @@
- {
-   cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
-   if (ri) {
-+     if (cStatus::MsgReplayProtected(ri->Recording(), ri->Name(), base,
-+                                     ri->IsDirectory()) == true)    // PIN 
PATCH
-+        return osContinue;
-      if (ri->IsDirectory())
-         Open();
-      else {
-@@ -4515,28 +4531,32 @@
- 
-   // Basic menu items:
- 
--  Add(new cOsdItem(hk(tr("Schedule")),   osSchedule));
--  Add(new cOsdItem(hk(tr("Channels")),   osChannels));
--  Add(new cOsdItem(hk(tr("Timers")),     osTimers));
--  Add(new cOsdItem(hk(tr("Recordings")), osRecordings));
-+  // PIN PATCH
-+  if (!cStatus::MsgMenuItemProtected("Schedule", true))   Add(new 
cOsdItem(hk(tr("Schedule")),   osSchedule));
-+  if (!cStatus::MsgMenuItemProtected("Channels", true))   Add(new 
cOsdItem(hk(tr("Channels")),   osChannels));
-+  if (!cStatus::MsgMenuItemProtected("Timers", true))     Add(new 
cOsdItem(hk(tr("Timers")),     osTimers));
-+  if (!cStatus::MsgMenuItemProtected("Recordings", true)) Add(new 
cOsdItem(hk(tr("Recordings")), osRecordings));
- 
-   // Plugins:
- 
-   for (int i = 0; ; i++) {
-       cPlugin *p = cPluginManager::GetPlugin(i);
-       if (p) {
-+         if (!cStatus::MsgPluginProtected(p, true)) {          // PIN PATCH
-          const char *item = p->MainMenuEntry();
-          if (item)
-             Add(new cMenuPluginItem(hk(item), i));
-          }
-+      }
-       else
-          break;
-       }
- 
-   // More basic menu items:
- 
--  Add(new cOsdItem(hk(tr("Setup")),      osSetup));
-+  if (!cStatus::MsgMenuItemProtected("Setup", true)) Add(new 
cOsdItem(hk(tr("Setup")), osSetup));  // PIN PATCH
-   if (Commands.Count())
-+     if (!cStatus::MsgMenuItemProtected("Commands", true))     // PIN PATCH
-      Add(new cOsdItem(hk(tr("Commands")),  osCommands));
- 
-   Update(true);
-@@ -4609,6 +4629,14 @@
-   eOSState state = cOsdMenu::ProcessKey(Key);
-   HadSubMenu |= HasSubMenu();
- 
-+  // > PIN PATCH
-+  cOsdItem* item = Get(Current());
-+
-+  if (item && item->Text() && state != osContinue && state != osUnknown && 
state != osBack)
-+     if (cStatus::MsgMenuItemProtected(item->Text()))
-+        return osContinue;
-+  // PIN PATCH <
-+
-   switch (state) {
-     case osSchedule:   return AddSubMenu(new cMenuSchedule);
-     case osChannels:   return AddSubMenu(new cMenuChannels);
-@@ -4633,6 +4661,7 @@
-                          if (item) {
-                             cPlugin *p = 
cPluginManager::GetPlugin(item->PluginIndex());
-                             if (p) {
-+                            if (!cStatus::MsgPluginProtected(p)) {  // PIN 
PATCH
-                                cOsdObject *menu = p->MainMenuAction();
-                                if (menu) {
-                                   if (menu->IsMenu())
-@@ -4644,6 +4673,7 @@
-                                   }
-                                }
-                             }
-+                         }
-                          state = osEnd;
-                        }
-                        break;
-@@ -4823,6 +4853,7 @@
-            Channel = Direction > 0 ? Channels->Next(Channel) : 
Channels->Prev(Channel);
-            if (!Channel && Setup.ChannelsWrap)
-               Channel = Direction > 0 ? Channels->First() : Channels->Last();
-+           if (!cStatus::MsgChannelProtected(0, Channel))                   
// PIN PATCH
-            if (Channel && !Channel->GroupSep() && cDevice::GetDevice(Channel, 
LIVEPRIORITY, true, true))
-               return Channel;
-            }
-@@ -5500,6 +5531,7 @@
-            for (int i = 0; i < MAXRECORDCONTROLS; i++) {
-                if (!RecordControls[i]) {
-                   RecordControls[i] = new cRecordControl(device, Timers, 
Timer, Pause);
-+                  cStatus::MsgRecordingFile(RecordControls[i]->FileName());  
// PIN PATCH
-                   return RecordControls[i]->Process(time(NULL));
-                   }
-                }
-diff -Naur vdr-2.6.7.orig/osd.c vdr-2.6.7/osd.c
---- vdr-2.6.7.orig/osd.c       2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/osd.c    2024-06-18 22:38:53.731925707 +0200
-@@ -1907,6 +1907,7 @@
- cSize cOsd::maxPixmapSize(INT_MAX, INT_MAX);
- cVector<cOsd *> cOsd::Osds;
- cMutex cOsd::mutex;
-+bool cOsd::pinValid = false;   // PIN PATCH
- 
- cOsd::cOsd(int Left, int Top, uint Level)
- {
-diff -Naur vdr-2.6.7.orig/osd.h vdr-2.6.7/osd.h
---- vdr-2.6.7.orig/osd.h       2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/osd.h    2024-06-18 22:38:53.731925707 +0200
-@@ -994,6 +994,7 @@
-        ///<
-        ///< If a plugin uses a derived cPixmap implementation, it needs to 
use that
-        ///< type instead of cPixmapMemory.
-+  static bool pinValid;   // PIN PATCH
-   };
- 
- #define MAXOSDIMAGES 64
-diff -Naur vdr-2.6.7.orig/status.c vdr-2.6.7/status.c
---- vdr-2.6.7.orig/status.c    2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/status.c 2024-06-18 22:38:53.731925707 +0200
-@@ -136,3 +136,55 @@
-   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
-       sm->OsdProgramme(PresentTime, PresentTitle, PresentSubtitle, 
FollowingTime, FollowingTitle, FollowingSubtitle);
- }
-+
-+bool cStatus::MsgChannelProtected(const cDevice* Device, const cChannel* 
Channel)     // PIN PATCH
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
-+      if (sm->ChannelProtected(Device, Channel) == true)
-+       return true;
-+
-+  return false;
-+}
-+
-+bool cStatus::MsgReplayProtected(const cRecording* Recording, const char* 
Name,
-+                                 const char* Base, bool isDirectory, int 
menuView)    // PIN PATCH
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
-+     if (sm->ReplayProtected(Recording, Name, Base, isDirectory, menuView) == 
true)
-+         return true;
-+      return false;
-+}
-+
-+void cStatus::MsgRecordingFile(const char* FileName)
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = 
statusMonitors.Next(sm))   // PIN PATCH
-+      sm->RecordingFile(FileName);
-+}
-+
-+void cStatus::MsgTimerCreation(cTimer* Timer, const cEvent *Event)
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = 
statusMonitors.Next(sm))   // PIN PATCH
-+     sm->TimerCreation(Timer, Event);
-+}
-+
-+bool cStatus::MsgPluginProtected(cPlugin* Plugin, int menuView)               
   // PIN PATCH
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
-+     if (sm->PluginProtected(Plugin, menuView) == true)
-+         return true;
-+      return false;
-+}
-+
-+void cStatus::MsgUserAction(const eKeys key)                                  
   // PIN PATCH
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
-+     sm->UserAction(key);
-+}
-+
-+bool cStatus::MsgMenuItemProtected(const char* Name, int menuView)            
   // PIN PATCH
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
-+     if (sm->MenuItemProtected(Name, menuView) == true)
-+         return true;
-+      return false;
-+}
-diff -Naur vdr-2.6.7.orig/status.h vdr-2.6.7/status.h
---- vdr-2.6.7.orig/status.h    2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/status.h 2024-06-18 22:38:53.731925707 +0200
-@@ -14,6 +14,7 @@
- #include "device.h"
- #include "player.h"
- #include "tools.h"
-+#include "plugin.h"
- 
- // Several member functions of the following classes are called with a 
pointer to
- // an object from a global list (cTimer, cChannel, cRecording or cEvent). In 
these
-@@ -99,6 +100,22 @@
-                // The OSD displays the single line Text with the current 
channel information.
-   virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, 
const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, 
const char *FollowingSubtitle) {}
-                // The OSD displays the given programme information.
-+  virtual bool ChannelProtected(const cDevice *Device, const cChannel* 
Channel)  { return false; }         // PIN PATCH
-+               // Checks if a channel is protected.
-+  virtual bool ReplayProtected(const cRecording* Recording, const char* Name,
-+                               const char* Base, bool isDirectory, int 
menuView = false) { return false; } // PIN PATCH
-+               // Checks if a recording is protected.
-+  virtual void RecordingFile(const char* FileName) {}                         
                             // PIN PATCH
-+               // The given DVB device has started recording to FileName. 
FileName is the name of the
-+               // recording directory
-+  virtual void TimerCreation(cTimer* Timer, const cEvent *Event) {}           
                             // PIN PATCH
-+               // The given timer is created
-+  virtual bool PluginProtected(cPlugin* Plugin, int menuView = false)  { 
return false; }                   // PIN PATCH
-+               // Checks if a plugin is protected.
-+  virtual void UserAction(const eKeys key) {}                                 
                             // PIN PATCH
-+               // report user action
-+  virtual bool MenuItemProtected(const char* Name, int menuView = false)  { 
return false; }                // PIN PATCH
-+
- public:
-   cStatus(void);
-   virtual ~cStatus();
-@@ -122,6 +139,14 @@
-   static void MsgOsdTextItem(const char *Text,  bool Scroll = false);
-   static void MsgOsdChannel(const char *Text);
-   static void MsgOsdProgramme(time_t PresentTime, const char *PresentTitle, 
const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, 
const char *FollowingSubtitle);
-+  static bool MsgChannelProtected(const cDevice* Device, const cChannel* 
Channel);                 // PIN PATCH
-+  static bool MsgReplayProtected(const cRecording* Recording, const char* 
Name,
-+                                 const char* Base, bool isDirectory, int 
menuView = false);        // PIN PATCH
-+  static void MsgRecordingFile(const char* FileName);                         
                     // PIN PATCH
-+  static void MsgTimerCreation(cTimer* Timer, const cEvent *Event);           
                     // PIN PATCH
-+  static bool MsgPluginProtected(cPlugin* Plugin, int menuView = false);      
                     // PIN PATCH
-+  static void MsgUserAction(const eKeys key);                                 
                     // PIN PATCH
-+  static bool MsgMenuItemProtected(const char* Name, int menuView = false);   
                     // PIN PATCH
-   };
- 
- #endif //__STATUS_H
-diff -Naur vdr-2.6.7.orig/timers.c vdr-2.6.7/timers.c
---- vdr-2.6.7.orig/timers.c    2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/timers.c 2024-06-18 22:41:36.147349313 +0200
-@@ -85,6 +85,7 @@
-      stop -= 2400;
-   priority = Pause ? Setup.PausePriority : Setup.DefaultPriority;
-   lifetime = Pause ? Setup.PauseLifetime : Setup.DefaultLifetime;
-+  fskProtection = 0;                                        // PIN PATCH
-   if (Instant && channel)
-      snprintf(file, sizeof(file), "%s%s", Setup.MarkInstantRecord ? "@" : "", 
*Setup.NameInstantRecord ? Setup.NameInstantRecord : channel->Name());
- }
-@@ -218,11 +219,13 @@
-      stop -= 2400;
-   priority = PatternTimer ? PatternTimer->Priority() : Setup.DefaultPriority;
-   lifetime = PatternTimer ? PatternTimer->Lifetime() : Setup.DefaultLifetime;
-+  fskProtection = 0;                                        // PIN PATCH
-   if (!FileName)
-      FileName = Event->Title();
-   if (!isempty(FileName))
-      Utf8Strn0Cpy(file, FileName, sizeof(file));
-   SetEvent(Event);
-+  cStatus::MsgTimerCreation(this, Event);                   // PIN PATCH
- }
- 
- cTimer::cTimer(const cTimer &Timer)
-@@ -261,6 +264,7 @@
-      stop         = Timer.stop;
-      priority     = Timer.priority;
-      lifetime     = Timer.lifetime;
-+     fskProtection = Timer.fskProtection;    // PIN PATCH
-      vpsNotRunning = 0;
-      vpsActive    = false;
-      strncpy(pattern, Timer.pattern, sizeof(pattern));
-@@ -492,6 +496,7 @@
-         result = false;
-         }
-      }
-+  fskProtection = aux && strstr(aux, 
"<pin-plugin><protected>yes</protected></pin-plugin>");  // PIN PATCH
-   free(channelbuffer);
-   free(daybuffer);
-   free(filebuffer);
-@@ -1069,6 +1074,36 @@
-   Matches(); // refresh start and end time
- }
- 
-+void cTimer::SetFskProtection(int aFlag)      // PIN PATCH
-+{
-+   char* p;
-+   char* tmp = 0;
-+   int res = 0;
-+
-+   fskProtection = aFlag;
-+
-+   if (fskProtection && (!aux || !strstr(aux, 
"<pin-plugin><protected>yes</protected></pin-plugin>")))
-+   {
-+      // add protection info to aux
-+
-+      if (aux) { tmp = strdup(aux); free(aux); }
-+      res = asprintf(&aux, 
"%s<pin-plugin><protected>yes</protected></pin-plugin>", tmp ? tmp : "");
-+   }
-+   else if (!fskProtection && aux && (p = strstr(aux, 
"<pin-plugin><protected>yes</protected></pin-plugin>")))
-+   {
-+      // remove protection info from aux
-+
-+      res = asprintf(&tmp, "%.*s%s", (int)(p-aux), aux, 
p+strlen("<pin-plugin><protected>yes</protected></pin-plugin>"));
-+      free(aux);
-+      aux = strdup(tmp);
-+   }
-+
-+   if (res < 0) ; // memory problems :o
-+
-+   if (tmp)
-+      free(tmp);
-+}
-+
- // --- cTimers ---------------------------------------------------------------
- 
- cTimers cTimers::timers;
-diff -Naur vdr-2.6.7.orig/timers.h vdr-2.6.7/timers.h
---- vdr-2.6.7.orig/timers.h    2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/timers.h 2024-06-18 22:38:53.731925707 +0200
-@@ -47,6 +47,7 @@
-   int start;          ///< the start and stop time of this timer as given by 
the user,
-   int stop;           ///< in the form hhmm, with hh (00..23) and mm (00..59) 
added as hh*100+mm
-   int priority;
-+  int fskProtection;                                               // PIN 
PATCH
-   int lifetime;
-   mutable char pattern[NAME_MAX * 2 + 1]; // same size as 'file', to be able 
to initially fill 'pattern' with 'file' in the 'Edit timer' menu
-   mutable char file[NAME_MAX * 2 + 1]; // *2 to be able to hold 'title' and 
'episode', which can each be up to 255 characters long
-@@ -72,6 +73,7 @@
-   int Start(void) const { return start; }
-   int Stop(void) const { return stop; }
-   int Priority(void) const { return priority; }
-+  int FskProtection(void) const { return fskProtection; }          // PIN 
PATCH
-   int Lifetime(void) const { return lifetime; }
-   const char *Pattern(void) const { return pattern; }
-   const char *File(void) const { return file; }
-@@ -122,6 +124,7 @@
-   void SetRemote(const char *Remote);
-   void SetDeferred(int Seconds);
-   void SetFlags(uint Flags);
-+  void SetFskProtection(int aFlag);                                // PIN 
PATCH
-   void ClrFlags(uint Flags);
-   void InvFlags(uint Flags);
-   bool HasFlags(uint Flags) const;
-diff -Naur vdr-2.6.7.orig/vdr.c vdr-2.6.7/vdr.c
---- vdr-2.6.7.orig/vdr.c       2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/vdr.c    2024-06-18 22:38:53.735925694 +0200
-@@ -72,6 +72,7 @@
- #include "tools.h"
- #include "transfer.h"
- #include "videodir.h"
-+#include "status.h"     // PIN PATCH
- 
- #define MINCHANNELWAIT        10 // seconds to wait between failed channel 
switchings
- #define ACTIVITYTIMEOUT       60 // seconds before starting housekeeping
-@@ -1217,6 +1218,7 @@
-         if (!Menu)
-            Interact = Control = cControl::Control(ControlMutexLock);
-         if (ISREALKEY(key)) {
-+           cStatus::MsgUserAction(key);           // PIN PATCH
-            EITScanner.Activity();
-            // Cancel shutdown countdown:
-            if (ShutdownHandler.countdown)
-@@ -1289,10 +1291,12 @@
-                      Control->Hide();
-                   cPlugin *plugin = cPluginManager::GetPlugin(PluginName);
-                   if (plugin) {
-+                     if (!cStatus::MsgPluginProtected(plugin)) {  // PIN PATCH
-                      Menu = plugin->MainMenuAction();
-                      if (Menu)
-                         Menu->Show();
-                      }
-+                  }
-                   else
-                      esyslog("ERROR: unknown plugin '%s'", PluginName);
-                   }
-@@ -1512,9 +1516,11 @@
-              case kPlay:
-                   if (cReplayControl::LastReplayed()) {
-                      Control = NULL;
-+                     if (cStatus::MsgReplayProtected(0, 
cReplayControl::LastReplayed(), 0, false) == false) {  // PIN PATCH
-                      cControl::Shutdown();
-                      cControl::Launch(new cReplayControl);
-                      }
-+                  }
-                   else
-                      DirectMainFunction(osRecordings); // no last viewed 
recording, so enter the Recordings menu
-                   break;

diff --git a/media-video/vdr/files/vdr-2.7.2-patch-for-permashift.patch 
b/media-video/vdr/files/vdr-2.7.2-patch-for-permashift.patch
deleted file mode 100644
index e3b654404280..000000000000
--- a/media-video/vdr/files/vdr-2.7.2-patch-for-permashift.patch
+++ /dev/null
@@ -1,520 +0,0 @@
-updated patch for vdr-2.7.2
-downloaded from 
https://www.vdr-portal.de/forum/index.php?thread/136461-announce-vdr-version-2-7-2-freigegeben/&postID=1374957#post1374957
-
-diff --git a/device.c b/device.c
-index b9c52190..15f650b2 100644
---- a/device.c
-+++ b/device.c
-@@ -1917,6 +1917,17 @@ void cDevice::DetachAllReceivers(void)
-   ReleaseCamSlot();
- }
- 
-+cRecorder* cDevice::GetPreRecording(const cChannel *Channel)
-+{
-+  cMutexLock MutexLock(&mutexReceiver);
-+  for (int i = 0; i < MAXRECEIVERS; i++) {
-+      if (receiver[i])
-+        if (receiver[i]->IsPreRecording(Channel))
-+                return (cRecorder*)receiver[i];
-+      }
-+  return NULL;
-+}
-+
- // --- cTSBuffer -------------------------------------------------------------
- 
- cTSBuffer::cTSBuffer(int File, int Size, int DeviceNumber)
-diff --git a/device.h b/device.h
-index fe60b3ef..4076f38e 100644
---- a/device.h
-+++ b/device.h
-@@ -85,6 +85,7 @@ struct tTrackId {
- 
- class cPlayer;
- class cReceiver;
-+class cRecorder;
- class cLiveSubtitle;
- 
- class cDeviceHook : public cListObject {
-@@ -867,6 +868,8 @@ public:
-        ///< Returns true if we are currently receiving. The parameter has no 
meaning (for backwards compatibility only).
-   bool AttachReceiver(cReceiver *Receiver);
-        ///< Attaches the given receiver to this device.
-+  cRecorder* GetPreRecording(const cChannel *Channel);
-+       ///< Get precocious recording for the channel if there is one.
-   void Detach(cReceiver *Receiver, bool ReleaseCam = true);
-        ///< Detaches the given receiver from this device.
-        ///< If ReleaseCam is true, the CAM slot will be released if it
-diff --git a/dvbplayer.c b/dvbplayer.c
-index c36fac70..9a0be3f6 100644
---- a/dvbplayer.c
-+++ b/dvbplayer.c
-@@ -249,13 +249,14 @@ private:
-   cUnbufferedFile *replayFile;
-   double framesPerSecond;
-   bool isPesRecording;
--  bool pauseLive;
-+  ReplayState replayState;
-   bool eof;
-   bool firstPacket;
-   ePlayModes playMode;
-   ePlayDirs playDir;
-   int trickSpeed;
-   int readIndex;
-+  int startIndex;
-   bool readIndependent;
-   cFrame *readFrame;
-   cFrame *playFrame;
-@@ -271,6 +272,8 @@ protected:
-   virtual void Action(void);
- public:
-   cDvbPlayer(const char *FileName, bool PauseLive);
-+  cDvbPlayer(const char *FileName, ReplayState newReplayState);
-+  void Construct(const char *FileName, ReplayState newReplayState);
-   virtual ~cDvbPlayer();
-   void SetMarks(const cMarks *Marks);
-   bool Active(void) { return cThread::Running(); }
-@@ -298,6 +301,17 @@ int cDvbPlayer::Speeds[] = { 0, -2, -4, -8, 1, 2, 4, 12, 
0 };
- cDvbPlayer::cDvbPlayer(const char *FileName, bool PauseLive)
- :cThread("dvbplayer")
- {
-+  Construct(FileName, PauseLive? restPauseLive : restNormal);
-+}
-+
-+cDvbPlayer::cDvbPlayer(const char *FileName, ReplayState newReplayState)
-+:cThread("dvbplayer")
-+{
-+  Construct(FileName, newReplayState);
-+}
-+
-+void cDvbPlayer::Construct(const char *FileName, ReplayState newReplayState)
-+{  
-   nonBlockingFileReader = NULL;
-   ringBuffer = NULL;
-   marks = NULL;
-@@ -305,7 +319,8 @@ cDvbPlayer::cDvbPlayer(const char *FileName, bool 
PauseLive)
-   cRecording Recording(FileName);
-   framesPerSecond = Recording.FramesPerSecond();
-   isPesRecording = Recording.IsPesRecording();
--  pauseLive = PauseLive;
-+  replayState = newReplayState;
-+  bool reuse = (replayState == restReusePause || replayState == 
restReuseRewind);
-   eof = false;
-   firstPacket = true;
-   playMode = pmPlay;
-@@ -324,15 +339,21 @@ cDvbPlayer::cDvbPlayer(const char *FileName, bool 
PauseLive)
-      return;
-   ringBuffer = new cRingBufferFrame(PLAYERBUFSIZE);
-   // Create the index file:
--  index = new cIndexFile(FileName, false, isPesRecording, pauseLive);
-+  index = new cIndexFile(FileName, false, isPesRecording, replayState == 
restPauseLive);
-   if (!index)
-      esyslog("ERROR: can't allocate index");
-   else if (!index->Ok()) {
-      delete index;
-      index = NULL;
-      }
--  else if (PauseLive)
-+  else if (reuse)
-      framesPerSecond = cRecording(FileName).FramesPerSecond(); // the fps 
rate might have changed from the default
-+  startIndex = 0;
-+  if (replayState == restReuseRewind || replayState == restReusePause) {
-+     int Current, Total;
-+     GetIndex(Current, Total, false);
-+     startIndex = max(Total - 1, 0);
-+     }     
- }
- 
- cDvbPlayer::~cDvbPlayer()
-@@ -482,8 +503,21 @@ void cDvbPlayer::Action(void)
-   bool CutIn = false;
-   bool AtLastMark = false;
- 
--  if (pauseLive)
--     Goto(0, true);
-+  if (replayState == restPauseLive) {
-+    Goto(0, true);
-+    }
-+  else if (replayState == restReuseRewind || replayState == restReusePause) {
-+    readIndex = startIndex;
-+    Goto(readIndex, true);
-+    playMode = pmPlay;
-+    if (replayState == restReuseRewind) {
-+      Backward();
-+        }
-+    else if (replayState == restReusePause) {
-+      Pause();
-+        }
-+    }
-+  
-   while (Running()) {
-         if (WaitingForData)
-            WaitingForData = !nonBlockingFileReader->WaitForDataMs(3); // this 
keeps the CPU load low, but reacts immediately on new data
-@@ -995,6 +1029,11 @@ cDvbPlayerControl::cDvbPlayerControl(const char 
*FileName, bool PauseLive)
-   SetPlayer(player);
- }
- 
-+cDvbPlayerControl::cDvbPlayerControl(const char *FileName, ReplayState 
replayState)
-+:cControl(player = new cDvbPlayer(FileName, replayState))
-+{
-+}
-+
- cDvbPlayerControl::~cDvbPlayerControl()
- {
-   Stop();
-diff --git a/dvbplayer.h b/dvbplayer.h
-index bac5b0c4..32a155b1 100644
---- a/dvbplayer.h
-+++ b/dvbplayer.h
-@@ -16,6 +16,14 @@
- 
- class cDvbPlayer;
- 
-+enum ReplayState
-+{
-+      restNormal,
-+      restPauseLive,
-+      restReusePause,
-+      restReuseRewind
-+};
-+
- class cDvbPlayerControl : public cControl {
- private:
-   cDvbPlayer *player;
-@@ -25,6 +33,8 @@ public:
-        // If PauseLive is true, special care is taken to make sure the index
-        // file of the recording is long enough to allow the player to display
-        // the first frame in still picture mode.
-+  cDvbPlayerControl(const char *FileName, ReplayState replayState);
-+       // Sets up a player for the given file. replayState represents the 
initial state.
-   virtual ~cDvbPlayerControl();
-   void SetMarks(const cMarks *Marks);
-   bool Active(void);
-diff --git a/menu.c b/menu.c
-index a5c429e3..a33915f6 100644
---- a/menu.c
-+++ b/menu.c
-@@ -5311,6 +5311,16 @@ eOSState cDisplaySubtitleTracks::ProcessKey(eKeys Key)
- // --- cRecordControl --------------------------------------------------------
- 
- cRecordControl::cRecordControl(cDevice *Device, cTimers *Timers, cTimer 
*Timer, bool Pause)
-+{
-+  Construct(Device, Timers, Timer, Pause, NULL);
-+}
-+
-+cRecordControl::cRecordControl(cDevice *Device, cTimers *Timers, cTimer 
*Timer, bool Pause, bool* reused)
-+{
-+  Construct(Device, Timers, Timer, Pause, reused);
-+}
-+
-+void cRecordControl::Construct(cDevice *Device, cTimers *Timers, cTimer 
*Timer, bool Pause, bool* reused)
- {
-   const char *LastReplayed = cReplayControl::LastReplayed(); // must do this 
before locking schedules!
-   // Whatever happens here, the timers will be modified in some way...
-@@ -5340,6 +5350,7 @@ cRecordControl::cRecordControl(cDevice *Device, cTimers 
*Timers, cTimer *Timer,
-   timer->SetPending(true);
-   timer->SetRecording(true);
-   event = timer->Event();
-+  if (reused != NULL) *reused = false;
- 
-   if (event || GetEvent())
-      dsyslog("Title: '%s' Subtitle: '%s'", event->Title(), 
event->ShortText());
-@@ -5369,8 +5380,21 @@ cRecordControl::cRecordControl(cDevice *Device, cTimers 
*Timers, cTimer *Timer,
-   if (MakeDirs(fileName, true)) {
-      Recording.WriteInfo(); // we write this *before* attaching the recorder 
to the device, to make sure the info file is present when the recorder needs to 
update the fps value!
-      const cChannel *ch = timer->Channel();
--     recorder = new cRecorder(fileName, ch, timer->Priority());
--     if (device->AttachReceiver(recorder)) {
-+
-+     if (!Timer) {
-+        recorder = device->GetPreRecording(ch);
-+        if (recorder != NULL) {
-+           recorder->ActivatePreRecording(fileName, timer->Priority());
-+           if (reused != NULL) *reused = true;
-+           }
-+        }
-+
-+     if (recorder == NULL) {
-+        recorder = new cRecorder(fileName, ch, timer->Priority());
-+        if (!device->AttachReceiver(recorder)) DELETENULL(recorder);
-+        }
-+
-+     if (recorder != NULL) {
-         cStatus::MsgRecording(device, Recording.Name(), Recording.FileName(), 
true);
-         if (!Timer && !LastReplayed) // an instant recording, maybe from 
cRecordControls::PauseLiveVideo()
-            cReplayControl::SetRecording(fileName);
-@@ -5380,8 +5404,6 @@ cRecordControl::cRecordControl(cDevice *Device, cTimers 
*Timers, cTimer *Timer,
-         Recordings->AddByName(fileName);
-         return;
-         }
--     else
--        DELETENULL(recorder);
-      }
-   else
-      timer->SetDeferred(DEFERTIMER);
-@@ -5461,7 +5483,7 @@ bool cRecordControl::Process(time_t t)
- cRecordControl *cRecordControls::RecordControls[MAXRECORDCONTROLS] = { NULL };
- int cRecordControls::state = 0;
- 
--bool cRecordControls::Start(cTimers *Timers, cTimer *Timer, bool Pause)
-+bool cRecordControls::Start(cTimers *Timers, cTimer *Timer, bool Pause, bool* 
reused)
- {
-   static time_t LastNoDiskSpaceMessage = 0;
-   int FreeMB = 0;
-@@ -5499,7 +5521,7 @@ bool cRecordControls::Start(cTimers *Timers, cTimer 
*Timer, bool Pause)
-         if (!Timer || Timer->Matches()) {
-            for (int i = 0; i < MAXRECORDCONTROLS; i++) {
-                if (!RecordControls[i]) {
--                  RecordControls[i] = new cRecordControl(device, Timers, 
Timer, Pause);
-+                  RecordControls[i] = new cRecordControl(device, Timers, 
Timer, Pause, reused);
-                   return RecordControls[i]->Process(time(NULL));
-                   }
-                }
-@@ -5523,6 +5545,11 @@ bool cRecordControls::Start(bool Pause)
-   return Start(Timers, NULL, Pause);
- }
- 
-+bool cRecordControls::Start(cTimers *Timers, cTimer *Timer, bool Pause)
-+{
-+  return Start(Timers, Timer, Pause, NULL);
-+}
-+
- void cRecordControls::Stop(const char *InstantId)
- {
-   LOCK_TIMERS_WRITE;
-@@ -5557,11 +5584,18 @@ void cRecordControls::Stop(cTimer *Timer)
- }
- 
- bool cRecordControls::PauseLiveVideo(void)
-+{
-+  return PauseLiveVideo(false);
-+}
-+
-+bool cRecordControls::PauseLiveVideo(bool rewind)
- {
-   Skins.Message(mtStatus, tr("Pausing live video..."));
-+  bool reused = false;  
-   cReplayControl::SetRecording(NULL); // make sure the new cRecordControl 
will set cReplayControl::LastReplayed()
--  if (Start(true)) {
--     cReplayControl *rc = new cReplayControl(true);
-+  LOCK_TIMERS_WRITE;
-+  if (Start(Timers, NULL, true, &reused)) {
-+     cReplayControl *rc = new cReplayControl(rewind? restReuseRewind : 
reused? restReusePause : restPauseLive);
-      cControl::Launch(rc);
-      cControl::Attach();
-      Skins.Message(mtStatus, NULL);
-@@ -5704,7 +5738,18 @@ cString cReplayControl::fileName;
- cReplayControl::cReplayControl(bool PauseLive)
- :cDvbPlayerControl(fileName, PauseLive)
- {
--  cDevice::PrimaryDevice()->SetKeepTracks(PauseLive);
-+  Construct(PauseLive? restPauseLive : restNormal);
-+}
-+
-+cReplayControl::cReplayControl(ReplayState replayState)
-+:cDvbPlayerControl(fileName, replayState)
-+{
-+  Construct(replayState);
-+}
-+
-+void cReplayControl::Construct(ReplayState replayState)
-+{
-+  cDevice::PrimaryDevice()->SetKeepTracks(replayState == restPauseLive);
-   currentReplayControl = this;
-   displayReplay = NULL;
-   marksModified = false;
-diff --git a/menu.h b/menu.h
-index 96c55e62..9446a70d 100644
---- a/menu.h
-+++ b/menu.h
-@@ -245,6 +245,8 @@ private:
-   bool GetEvent(void);
- public:
-   cRecordControl(cDevice *Device, cTimers *Timers, cTimer *Timer = NULL, bool 
Pause = false);
-+  cRecordControl(cDevice *Device, cTimers *Timers, cTimer *Timer, bool Pause, 
bool* reused);
-+  void Construct(cDevice *Device, cTimers *Timers, cTimer *Timer, bool Pause, 
bool* reused);
-   virtual ~cRecordControl();
-   bool Process(time_t t);
-   cDevice *Device(void) { return device; }
-@@ -260,10 +262,12 @@ private:
-   static int state;
- public:
-   static bool Start(cTimers *Timers, cTimer *Timer, bool Pause = false);
-+  static bool Start(cTimers *Timers, cTimer *Timer, bool Pause, bool* reused);
-   static bool Start(bool Pause = false);
-   static void Stop(const char *InstantId);
-   static void Stop(cTimer *Timer);
-   static bool PauseLiveVideo(void);
-+  static bool PauseLiveVideo(bool rewind);
-   static const char *GetInstantId(const char *LastInstantId);
-   static cRecordControl *GetRecordControl(const char *FileName);
-   static cRecordControl *GetRecordControl(const cTimer *Timer);
-@@ -320,6 +324,8 @@ private:
-   void EditTest(void);
- public:
-   cReplayControl(bool PauseLive = false);
-+  cReplayControl(ReplayState replayState);
-+  void Construct(ReplayState replayState);
-   virtual ~cReplayControl();
-   void Stop(void);
-   virtual cOsdObject *GetInfo(void);
-diff --git a/receiver.h b/receiver.h
-index 9bbc6bdb..b76969bb 100644
---- a/receiver.h
-+++ b/receiver.h
-@@ -85,6 +85,10 @@ public:
-                ///< case the device is needed otherwise, so code that uses a 
cReceiver
-                ///< should repeatedly check whether it is still attached, and 
if
-                ///< it isn't, delete it (or take any other appropriate 
measures).
-+  virtual bool IsPreRecording(const cChannel *Channel) { return false; }
-+               ///< prerecords given channel; may be turned into a disc 
recording.
-+  virtual bool ActivatePreRecording(const char* fileName, int Priority) { 
return false; }
-+                         ///< turn prerecording into a disc recording
-   };
- 
- #endif //__RECEIVER_H
-diff --git a/recorder.c b/recorder.c
-index 0b3fdab1..dc5976c2 100644
---- a/recorder.c
-+++ b/recorder.c
-@@ -24,9 +24,19 @@
- cRecorder::cRecorder(const char *FileName, const cChannel *Channel, int 
Priority)
- :cReceiver(Channel, Priority)
- ,cThread("recording")
-+,ringBuffer(NULL), frameDetector(NULL), fileName(NULL), recordingInfo(NULL), 
index(NULL), recordFile(NULL), recordingName(NULL)
-+{
-+  if (FileName != NULL) {
-+     InitializeFile(FileName, Channel);
-+     }
-+}
-+
-+void cRecorder::InitializeFile(const char *FileName, const cChannel *Channel)
- {
-   recordingName = strdup(FileName);
--  recordingInfo = new cRecordingInfo(recordingName);
-+  if (recordingInfo == NULL) {
-+     recordingInfo = new cRecordingInfo(recordingName);
-+     }
-   recordingInfo->Read();
-   oldErrors = max(0, recordingInfo->Errors()); // in case this is a 
re-started recording
-   errors = 0;
-@@ -51,7 +61,9 @@ cRecorder::cRecorder(const char *FileName, const cChannel 
*Channel, int Priority
-      Pid = Channel->Dpid(0);
-      Type = 0x06;
-      }
--  frameDetector = new cFrameDetector(Pid, Type);
-+  if (frameDetector == NULL) {
-+     frameDetector = new cFrameDetector(Pid, Type);
-+     }
-   index = NULL;
-   fileSize = 0;
-   lastDiskSpaceCheck = time(NULL);
-diff --git a/recorder.h b/recorder.h
-index a1858635..caf067f3 100644
---- a/recorder.h
-+++ b/recorder.h
-@@ -16,8 +16,8 @@
- #include "ringbuffer.h"
- #include "thread.h"
- 
--class cRecorder : public cReceiver, cThread {
--private:
-+class cRecorder : public cReceiver, protected cThread {
-+protected:
-   cRingBufferLinear *ringBuffer;
-   cFrameDetector *frameDetector;
-   cPatPmtGenerator patPmtGenerator;
-@@ -36,7 +36,6 @@ private:
-   bool RunningLowOnDiskSpace(void);
-   bool NextFile(void);
-   void HandleErrors(bool Force = false);
--protected:
-   virtual void Activate(bool On);
-        ///< If you override Activate() you need to call Detach() (which is a
-        ///< member of the cReceiver class) from your own destructor in order
-@@ -44,6 +43,9 @@ protected:
-        ///< destroyed.
-   virtual void Receive(const uchar *Data, int Length);
-   virtual void Action(void);
-+  void InitializeFile(const char *FileName, const cChannel *Channel);
-+       ///< Starts recording to file.
-+       ///< Called in constructor if file name has been given.
- public:
-   cRecorder(const char *FileName, const cChannel *Channel, int Priority);
-        ///< Creates a new recorder for the given Channel and
-diff --git a/ringbuffer.c b/ringbuffer.c
-index 902c8878..89247d60 100644
---- a/ringbuffer.c
-+++ b/ringbuffer.c
-@@ -368,6 +368,25 @@ uchar *cRingBufferLinear::Get(int &Count)
-   return NULL;
- }
- 
-+uchar *cRingBufferLinear::GetRest(int &Count)
-+{
-+  int Head = head;
-+  if (getThreadTid <= 0)
-+     getThreadTid = cThread::ThreadId();
-+  int rest = Size() - tail;
-+  int diff = Head - tail;
-+  int cont = (diff >= 0) ? diff : Size() + diff - margin;
-+  if (cont > rest)
-+     cont = rest;
-+  uchar *p = buffer + tail;
-+  if (cont > 0) {
-+     Count = gotten = cont;
-+     return p;
-+     }
-+  WaitForGet();
-+  return NULL;
-+}
-+
- void cRingBufferLinear::Del(int Count)
- {
-   if (Count > gotten) {
-diff --git a/ringbuffer.h b/ringbuffer.h
-index 746fc51e..6dfe6654 100644
---- a/ringbuffer.h
-+++ b/ringbuffer.h
-@@ -98,6 +98,12 @@ public:
-     ///< The data will remain in the buffer until a call to Del() deletes it.
-     ///< Returns a pointer to the data, and stores the number of bytes
-     ///< actually available in Count. If the returned pointer is NULL, Count 
has no meaning.
-+  uchar *GetRest(int &Count);
-+  ///< Gets data from the ring buffer disregarding the margin.
-+  ///< Might have to be called several times to get all data.
-+  ///< The data will remain in the buffer until a call to Del() deletes it.
-+  ///< Returns a pointer to the data, and stores the number of bytes
-+  ///< actually available in Count. If the returned pointer is NULL, Count 
has no meaning.
-   void Del(int Count);
-     ///< Deletes at most Count bytes from the ring buffer.
-     ///< Count must be less or equal to the number that was returned by a 
previous
-diff --git a/vdr.c b/vdr.c
-index 6056e2f0..08eaaaae 100644
---- a/vdr.c
-+++ b/vdr.c
-@@ -1359,13 +1359,24 @@ int main(int argc, char *argv[])
-                key = kNone;
-                break;
-           // Pausing live video:
-+          case kFastRew:
-+               if (cOsd::IsOpen())
-+                  break;
-+               {
-+               // test if there's a live buffer to rewind into...
-+               LOCK_CHANNELS_READ;
-+               if 
(cDevice::ActualDevice()->GetPreRecording(Channels->GetByNumber(cDevice::CurrentChannel()))
 == NULL) {
-+                  break;
-+                  }
-+               }
-+               // fall through to pause
-           case kPlayPause:
-           case kPause:
-                if (!Control) {
-                   DELETE_MENU;
-                   if (Setup.PauseKeyHandling) {
-                      if (Setup.PauseKeyHandling > 1 || 
Interface->Confirm(tr("Pause live video?"))) {
--                        if (!cRecordControls::PauseLiveVideo())
-+                        if (!cRecordControls::PauseLiveVideo(int(key) == 
kFastRew))
-                            Skins.QueueMessage(mtError, tr("No free DVB device 
to record!"));
-                         }
-                      }

diff --git a/media-video/vdr/files/vdr-2.7.3_pinplugin.patch 
b/media-video/vdr/files/vdr-2.7.3_pinplugin.patch
deleted file mode 100644
index b4f8757cb445..000000000000
--- a/media-video/vdr/files/vdr-2.7.3_pinplugin.patch
+++ /dev/null
@@ -1,435 +0,0 @@
-original vdr-pinplugin_vdr-2.3.1.diff
-rebased for media-video/vdr-2.6.7
-
-Signed-off-by: Christian Kunkel <[email protected]> ( 2021 Feb 12 )
-Reviewed-by: Martin Dummer <[email protected]> ( 2024-06-18 )
-diff -Naur vdr-2.6.7.orig/device.c vdr-2.6.7/device.c
---- vdr-2.6.7.orig/device.c    2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/device.c 2024-06-18 22:38:53.727925721 +0200
-@@ -847,6 +847,7 @@
-      const cChannel *Channel;
-      while ((Channel = Channels->GetByNumber(n, Direction)) != NULL) {
-            // try only channels which are currently available
-+           if (!cStatus::MsgChannelProtected(0, Channel))      // PIN PATCH
-            if (GetDevice(Channel, LIVEPRIORITY, true, true))
-               break;
-            n = Channel->Number() + Direction;
-@@ -868,6 +869,12 @@
- 
- eSetChannelResult cDevice::SetChannel(const cChannel *Channel, bool LiveView)
- {
-+  // I hope 'LiveView = false' indicates a channel switch for recording, // 
PIN PATCH
-+  // I really don't know, but it works ...                               // 
PIN PATCH
-+
-+  if (LiveView && cStatus::MsgChannelProtected(this, Channel))           // 
PIN PATCH
-+     return scrNotAvailable;                                             // 
PIN PATCH
-+
-   cMutexLock MutexLock(&mutexChannel); // to avoid a race between SVDRP CHAN 
and HasProgramme()
-   cStatus::MsgChannelSwitch(this, 0, LiveView);
- 
-diff -Naur vdr-2.6.7.orig/menu.c vdr-2.6.7/menu.c
---- vdr-2.6.7.orig/menu.c      2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/menu.c   2024-06-18 22:38:53.727925721 +0200
-@@ -1035,6 +1035,18 @@
-      Add(new cMenuEditBitItem( tr("VPS"),          &data.flags, tfVps));
-      Add(new cMenuEditIntItem( tr("Priority"),     &data.priority, 0, 
MAXPRIORITY));
-      Add(new cMenuEditIntItem( tr("Lifetime"),     &data.lifetime, 0, 
MAXLIFETIME));
-+
-+     // PIN PATCH
-+     if (cOsd::pinValid || !data.fskProtection) Add(new 
cMenuEditBoolItem(tr("Childlock"),&data.fskProtection));
-+     else {
-+        char* buf = 0;
-+        int res = 0;
-+        res = asprintf(&buf, "%s\t%s", tr("Childlock"), data.fskProtection ? 
tr("yes") : tr("no"));
-+        if (res < 0) ; // memory problems :o
-+        Add(new cOsdItem(buf));
-+        free(buf);
-+        }
-+
-      Add(file = new cMenuEditStrItem( tr("File"),   data.file, 
sizeof(data.file)));
-      SetFirstDayItem();
-      SetPatternItem(true);
-@@ -3129,7 +3141,8 @@
-                       }
-                    }
-                }
--            if (*Item->Text() && !LastDir) {
-+            if (*Item->Text() && !LastDir
-+                && (!cStatus::MsgReplayProtected(Item->Recording(), 
Item->Name(), base, Item->IsDirectory(), true))) { // PIN PATCH
-                Add(Item);
-                LastItem = Item;
-                if (Item->IsDirectory())
-@@ -3200,6 +3213,9 @@
- {
-   cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
-   if (ri) {
-+     if (cStatus::MsgReplayProtected(ri->Recording(), ri->Name(), base,
-+                                     ri->IsDirectory()) == true)    // PIN 
PATCH
-+        return osContinue;
-      if (ri->IsDirectory())
-         Open();
-      else {
-@@ -4515,28 +4531,32 @@
- 
-   // Basic menu items:
- 
--  Add(new cOsdItem(hk(tr("Schedule")),   osSchedule));
--  Add(new cOsdItem(hk(tr("Channels")),   osChannels));
--  Add(new cOsdItem(hk(tr("Timers")),     osTimers));
--  Add(new cOsdItem(hk(tr("Recordings")), osRecordings));
-+  // PIN PATCH
-+  if (!cStatus::MsgMenuItemProtected("Schedule", true))   Add(new 
cOsdItem(hk(tr("Schedule")),   osSchedule));
-+  if (!cStatus::MsgMenuItemProtected("Channels", true))   Add(new 
cOsdItem(hk(tr("Channels")),   osChannels));
-+  if (!cStatus::MsgMenuItemProtected("Timers", true))     Add(new 
cOsdItem(hk(tr("Timers")),     osTimers));
-+  if (!cStatus::MsgMenuItemProtected("Recordings", true)) Add(new 
cOsdItem(hk(tr("Recordings")), osRecordings));
- 
-   // Plugins:
- 
-   for (int i = 0; ; i++) {
-       cPlugin *p = cPluginManager::GetPlugin(i);
-       if (p) {
-+         if (!cStatus::MsgPluginProtected(p, true)) {          // PIN PATCH
-          const char *item = p->MainMenuEntry();
-          if (item)
-             Add(new cMenuPluginItem(hk(item), i));
-          }
-+      }
-       else
-          break;
-       }
- 
-   // More basic menu items:
- 
--  Add(new cOsdItem(hk(tr("Setup")),      osSetup));
-+  if (!cStatus::MsgMenuItemProtected("Setup", true)) Add(new 
cOsdItem(hk(tr("Setup")), osSetup));  // PIN PATCH
-   if (Commands.Count())
-+     if (!cStatus::MsgMenuItemProtected("Commands", true))     // PIN PATCH
-      Add(new cOsdItem(hk(tr("Commands")),  osCommands));
- 
-   Update(true);
-@@ -4609,6 +4629,14 @@
-   eOSState state = cOsdMenu::ProcessKey(Key);
-   HadSubMenu |= HasSubMenu();
- 
-+  // > PIN PATCH
-+  cOsdItem* item = Get(Current());
-+
-+  if (item && item->Text() && state != osContinue && state != osUnknown && 
state != osBack)
-+     if (cStatus::MsgMenuItemProtected(item->Text()))
-+        return osContinue;
-+  // PIN PATCH <
-+
-   switch (state) {
-     case osSchedule:   return AddSubMenu(new cMenuSchedule);
-     case osChannels:   return AddSubMenu(new cMenuChannels);
-@@ -4633,6 +4661,7 @@
-                          if (item) {
-                             cPlugin *p = 
cPluginManager::GetPlugin(item->PluginIndex());
-                             if (p) {
-+                            if (!cStatus::MsgPluginProtected(p)) {  // PIN 
PATCH
-                                cOsdObject *menu = p->MainMenuAction();
-                                if (menu) {
-                                   if (menu->IsMenu())
-@@ -4644,6 +4673,7 @@
-                                   }
-                                }
-                             }
-+                         }
-                          state = osEnd;
-                        }
-                        break;
-@@ -4823,6 +4853,7 @@
-            Channel = Direction > 0 ? Channels->Next(Channel) : 
Channels->Prev(Channel);
-            if (!Channel && Setup.ChannelsWrap)
-               Channel = Direction > 0 ? Channels->First() : Channels->Last();
-+           if (!cStatus::MsgChannelProtected(0, Channel))                   
// PIN PATCH
-            if (Channel && !Channel->GroupSep() && cDevice::GetDevice(Channel, 
LIVEPRIORITY, true, true))
-               return Channel;
-            }
-@@ -5500,6 +5531,7 @@
-            for (int i = 0; i < MAXRECORDCONTROLS; i++) {
-                if (!RecordControls[i]) {
-                   RecordControls[i] = new cRecordControl(device, Timers, 
Timer, Pause);
-+                  cStatus::MsgRecordingFile(RecordControls[i]->FileName());  
// PIN PATCH
-                   return RecordControls[i]->Process(time(NULL));
-                   }
-                }
-diff -Naur vdr-2.6.7.orig/osd.c vdr-2.6.7/osd.c
---- vdr-2.6.7.orig/osd.c       2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/osd.c    2024-06-18 22:38:53.731925707 +0200
-@@ -1907,6 +1907,7 @@
- cSize cOsd::maxPixmapSize(INT_MAX, INT_MAX);
- cVector<cOsd *> cOsd::Osds;
- cMutex cOsd::mutex;
-+bool cOsd::pinValid = false;   // PIN PATCH
- 
- cOsd::cOsd(int Left, int Top, uint Level)
- {
-diff -Naur vdr-2.6.7.orig/osd.h vdr-2.6.7/osd.h
---- vdr-2.6.7.orig/osd.h       2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/osd.h    2024-06-18 22:38:53.731925707 +0200
-@@ -994,6 +994,7 @@
-        ///<
-        ///< If a plugin uses a derived cPixmap implementation, it needs to 
use that
-        ///< type instead of cPixmapMemory.
-+  static bool pinValid;   // PIN PATCH
-   };
- 
- #define MAXOSDIMAGES 64
-diff -Naur vdr-2.6.7.orig/status.c vdr-2.6.7/status.c
---- vdr-2.6.7.orig/status.c    2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/status.c 2024-06-18 22:38:53.731925707 +0200
-@@ -136,3 +136,55 @@
-   for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
-       sm->OsdProgramme(PresentTime, PresentTitle, PresentSubtitle, 
FollowingTime, FollowingTitle, FollowingSubtitle);
- }
-+
-+bool cStatus::MsgChannelProtected(const cDevice* Device, const cChannel* 
Channel)     // PIN PATCH
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
-+      if (sm->ChannelProtected(Device, Channel) == true)
-+       return true;
-+
-+  return false;
-+}
-+
-+bool cStatus::MsgReplayProtected(const cRecording* Recording, const char* 
Name,
-+                                 const char* Base, bool isDirectory, int 
menuView)    // PIN PATCH
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
-+     if (sm->ReplayProtected(Recording, Name, Base, isDirectory, menuView) == 
true)
-+         return true;
-+      return false;
-+}
-+
-+void cStatus::MsgRecordingFile(const char* FileName)
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = 
statusMonitors.Next(sm))   // PIN PATCH
-+      sm->RecordingFile(FileName);
-+}
-+
-+void cStatus::MsgTimerCreation(cTimer* Timer, const cEvent *Event)
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = 
statusMonitors.Next(sm))   // PIN PATCH
-+     sm->TimerCreation(Timer, Event);
-+}
-+
-+bool cStatus::MsgPluginProtected(cPlugin* Plugin, int menuView)               
   // PIN PATCH
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
-+     if (sm->PluginProtected(Plugin, menuView) == true)
-+         return true;
-+      return false;
-+}
-+
-+void cStatus::MsgUserAction(const eKeys key)                                  
   // PIN PATCH
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
-+     sm->UserAction(key);
-+}
-+
-+bool cStatus::MsgMenuItemProtected(const char* Name, int menuView)            
   // PIN PATCH
-+{
-+  for (cStatus *sm = statusMonitors.First(); sm; sm = statusMonitors.Next(sm))
-+     if (sm->MenuItemProtected(Name, menuView) == true)
-+         return true;
-+      return false;
-+}
-diff -Naur vdr-2.6.7.orig/status.h vdr-2.6.7/status.h
---- vdr-2.6.7.orig/status.h    2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/status.h 2024-06-18 22:38:53.731925707 +0200
-@@ -14,6 +14,7 @@
- #include "device.h"
- #include "player.h"
- #include "tools.h"
-+#include "plugin.h"
- 
- // Several member functions of the following classes are called with a 
pointer to
- // an object from a global list (cTimer, cChannel, cRecording or cEvent). In 
these
-@@ -99,6 +100,22 @@
-                // The OSD displays the single line Text with the current 
channel information.
-   virtual void OsdProgramme(time_t PresentTime, const char *PresentTitle, 
const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, 
const char *FollowingSubtitle) {}
-                // The OSD displays the given programme information.
-+  virtual bool ChannelProtected(const cDevice *Device, const cChannel* 
Channel)  { return false; }         // PIN PATCH
-+               // Checks if a channel is protected.
-+  virtual bool ReplayProtected(const cRecording* Recording, const char* Name,
-+                               const char* Base, bool isDirectory, int 
menuView = false) { return false; } // PIN PATCH
-+               // Checks if a recording is protected.
-+  virtual void RecordingFile(const char* FileName) {}                         
                             // PIN PATCH
-+               // The given DVB device has started recording to FileName. 
FileName is the name of the
-+               // recording directory
-+  virtual void TimerCreation(cTimer* Timer, const cEvent *Event) {}           
                             // PIN PATCH
-+               // The given timer is created
-+  virtual bool PluginProtected(cPlugin* Plugin, int menuView = false)  { 
return false; }                   // PIN PATCH
-+               // Checks if a plugin is protected.
-+  virtual void UserAction(const eKeys key) {}                                 
                             // PIN PATCH
-+               // report user action
-+  virtual bool MenuItemProtected(const char* Name, int menuView = false)  { 
return false; }                // PIN PATCH
-+
- public:
-   cStatus(void);
-   virtual ~cStatus();
-@@ -122,6 +139,14 @@
-   static void MsgOsdTextItem(const char *Text,  bool Scroll = false);
-   static void MsgOsdChannel(const char *Text);
-   static void MsgOsdProgramme(time_t PresentTime, const char *PresentTitle, 
const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, 
const char *FollowingSubtitle);
-+  static bool MsgChannelProtected(const cDevice* Device, const cChannel* 
Channel);                 // PIN PATCH
-+  static bool MsgReplayProtected(const cRecording* Recording, const char* 
Name,
-+                                 const char* Base, bool isDirectory, int 
menuView = false);        // PIN PATCH
-+  static void MsgRecordingFile(const char* FileName);                         
                     // PIN PATCH
-+  static void MsgTimerCreation(cTimer* Timer, const cEvent *Event);           
                     // PIN PATCH
-+  static bool MsgPluginProtected(cPlugin* Plugin, int menuView = false);      
                     // PIN PATCH
-+  static void MsgUserAction(const eKeys key);                                 
                     // PIN PATCH
-+  static bool MsgMenuItemProtected(const char* Name, int menuView = false);   
                     // PIN PATCH
-   };
- 
- #endif //__STATUS_H
-diff -Naur vdr-2.6.7.orig/timers.c vdr-2.6.7/timers.c
---- vdr-2.6.7.orig/timers.c    2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/timers.c 2024-06-18 22:41:36.147349313 +0200
-@@ -85,6 +85,7 @@
-      stop -= 2400;
-   priority = Pause ? Setup.PausePriority : Setup.DefaultPriority;
-   lifetime = Pause ? Setup.PauseLifetime : Setup.DefaultLifetime;
-+  fskProtection = 0;                                        // PIN PATCH
-   if (Instant && channel)
-      snprintf(file, sizeof(file), "%s%s", Setup.MarkInstantRecord ? "@" : "", 
*Setup.NameInstantRecord ? Setup.NameInstantRecord : channel->Name());
- }
-@@ -218,11 +219,13 @@
-      stop -= 2400;
-   priority = PatternTimer ? PatternTimer->Priority() : Setup.DefaultPriority;
-   lifetime = PatternTimer ? PatternTimer->Lifetime() : Setup.DefaultLifetime;
-+  fskProtection = 0;                                        // PIN PATCH
-   if (!FileName)
-      FileName = Event->Title();
-   if (!isempty(FileName))
-      Utf8Strn0Cpy(file, FileName, sizeof(file));
-   SetEvent(Event);
-+  cStatus::MsgTimerCreation(this, Event);                   // PIN PATCH
- }
- 
- cTimer::cTimer(const cTimer &Timer)
-@@ -261,6 +264,7 @@
-      stop         = Timer.stop;
-      priority     = Timer.priority;
-      lifetime     = Timer.lifetime;
-+     fskProtection = Timer.fskProtection;    // PIN PATCH
-      vpsNotRunning = 0;
-      vpsActive    = false;
-      strncpy(pattern, Timer.pattern, sizeof(pattern));
-@@ -492,6 +496,7 @@
-         result = false;
-         }
-      }
-+  fskProtection = aux && strstr(aux, 
"<pin-plugin><protected>yes</protected></pin-plugin>");  // PIN PATCH
-   free(channelbuffer);
-   free(daybuffer);
-   free(filebuffer);
-@@ -1069,6 +1074,36 @@
-   Matches(); // refresh start and end time
- }
- 
-+void cTimer::SetFskProtection(int aFlag)      // PIN PATCH
-+{
-+   char* p;
-+   char* tmp = 0;
-+   int res = 0;
-+
-+   fskProtection = aFlag;
-+
-+   if (fskProtection && (!aux || !strstr(aux, 
"<pin-plugin><protected>yes</protected></pin-plugin>")))
-+   {
-+      // add protection info to aux
-+
-+      if (aux) { tmp = strdup(aux); free(aux); }
-+      res = asprintf(&aux, 
"%s<pin-plugin><protected>yes</protected></pin-plugin>", tmp ? tmp : "");
-+   }
-+   else if (!fskProtection && aux && (p = strstr(aux, 
"<pin-plugin><protected>yes</protected></pin-plugin>")))
-+   {
-+      // remove protection info from aux
-+
-+      res = asprintf(&tmp, "%.*s%s", (int)(p-aux), aux, 
p+strlen("<pin-plugin><protected>yes</protected></pin-plugin>"));
-+      free(aux);
-+      aux = strdup(tmp);
-+   }
-+
-+   if (res < 0) ; // memory problems :o
-+
-+   if (tmp)
-+      free(tmp);
-+}
-+
- // --- cTimers ---------------------------------------------------------------
- 
- cTimers cTimers::timers;
-diff -Naur vdr-2.6.7.orig/timers.h vdr-2.6.7/timers.h
---- vdr-2.6.7.orig/timers.h    2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/timers.h 2024-06-18 22:38:53.731925707 +0200
-@@ -47,6 +47,7 @@
-   int start;          ///< the start and stop time of this timer as given by 
the user,
-   int stop;           ///< in the form hhmm, with hh (00..23) and mm (00..59) 
added as hh*100+mm
-   int priority;
-+  int fskProtection;                                               // PIN 
PATCH
-   int lifetime;
-   mutable char pattern[NAME_MAX * 2 + 1]; // same size as 'file', to be able 
to initially fill 'pattern' with 'file' in the 'Edit timer' menu
-   mutable char file[NAME_MAX * 2 + 1]; // *2 to be able to hold 'title' and 
'episode', which can each be up to 255 characters long
-@@ -72,6 +73,7 @@
-   int Start(void) const { return start; }
-   int Stop(void) const { return stop; }
-   int Priority(void) const { return priority; }
-+  int FskProtection(void) const { return fskProtection; }          // PIN 
PATCH
-   int Lifetime(void) const { return lifetime; }
-   const char *Pattern(void) const { return pattern; }
-   const char *File(void) const { return file; }
-@@ -122,6 +124,7 @@
-   void SetRemote(const char *Remote);
-   void SetDeferred(int Seconds);
-   void SetFlags(uint Flags);
-+  void SetFskProtection(int aFlag);                                // PIN 
PATCH
-   void ClrFlags(uint Flags);
-   void InvFlags(uint Flags);
-   bool HasFlags(uint Flags) const;
-diff -Naur vdr-2.6.7.orig/vdr.c vdr-2.6.7/vdr.c
---- vdr-2.6.7.orig/vdr.c       2024-04-02 09:05:33.000000000 +0200
-+++ vdr-2.6.7/vdr.c    2024-06-18 22:38:53.735925694 +0200
-@@ -72,6 +72,7 @@
- #include "tools.h"
- #include "transfer.h"
- #include "videodir.h"
-+#include "status.h"     // PIN PATCH
- 
- #define MINCHANNELWAIT        10 // seconds to wait between failed channel 
switchings
- #define ACTIVITYTIMEOUT       60 // seconds before starting housekeeping
-@@ -1217,6 +1218,7 @@
-         if (!Menu)
-            Interact = Control = cControl::Control(ControlMutexLock);
-         if (ISREALKEY(key)) {
-+           cStatus::MsgUserAction(key);           // PIN PATCH
-            EITScanner.Activity();
-            // Cancel shutdown countdown:
-            if (ShutdownHandler.countdown)
-@@ -1289,10 +1291,12 @@
-                      Control->Hide();
-                   cPlugin *plugin = cPluginManager::GetPlugin(PluginName);
-                   if (plugin) {
-+                     if (!cStatus::MsgPluginProtected(plugin)) {  // PIN PATCH
-                      Menu = plugin->MainMenuAction();
-                      if (Menu)
-                         Menu->Show();
-                      }
-+                  }
-                   else
-                      esyslog("ERROR: unknown plugin '%s'", PluginName);
-                   }
-@@ -1512,9 +1516,11 @@
-              case kPlay:
-                   if (cReplayControl::LastReplayed()) {
-                      Control = NULL;
-+                     if (cStatus::MsgReplayProtected(0, 
cReplayControl::LastReplayed(), 0, false) == false) {  // PIN PATCH
-                      cControl::Shutdown();
-                      cControl::Launch(new cReplayControl);
-                      }
-+                  }
-                   else
-                      DirectMainFunction(osRecordings); // no last viewed 
recording, so enter the Recordings menu
-                   break;

diff --git a/media-video/vdr/vdr-2.6.9.ebuild b/media-video/vdr/vdr-2.6.9.ebuild
deleted file mode 100644
index 62092ddacd56..000000000000
--- a/media-video/vdr/vdr-2.6.9.ebuild
+++ /dev/null
@@ -1,199 +0,0 @@
-# Copyright 2021-2024 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-inherit flag-o-matic strip-linguas toolchain-funcs user-info
-
-DESCRIPTION="Video Disk Recorder - turns a pc into a powerful set top box for 
DVB"
-HOMEPAGE="http://www.tvdr.de/";
-SRC_URI="http://git.tvdr.de/?p=vdr.git;a=snapshot;h=refs/tags/${PV};sf=tbz2 -> 
${P}.tbz2
-       menuorg? ( 
https://github.com/vdr-projects/vdr-plugin-menuorg/raw/master/vdr-patch/vdr-menuorg-2.3.x.diff
 )
-       ttxtsubs? ( https://md11.it.cx/download/${PN}/${P}_ttxtsubs_v2.patch )"
-
-LICENSE="GPL-2+"
-SLOT="0"
-KEYWORDS="amd64 ~arm ~arm64 ~ppc x86"
-IUSE="bidi debug demoplugins html keyboard mainmenuhooks menuorg naludump 
permashift pinplugin systemd ttxtsubs verbose"
-
-COMMON_DEPEND="
-       acct-group/vdr
-       acct-user/vdr
-       media-libs/fontconfig
-       media-libs/freetype
-       media-libs/libjpeg-turbo:=
-       sys-libs/libcap"
-DEPEND="${COMMON_DEPEND}
-       sys-kernel/linux-headers"
-RDEPEND="${COMMON_DEPEND}
-       dev-lang/perl
-       media-tv/gentoo-vdr-scripts
-       media-fonts/corefonts
-       bidi? ( dev-libs/fribidi )
-       systemd? ( sys-apps/systemd )"
-BDEPEND="
-       sys-devel/gettext
-       virtual/pkgconfig"
-
-REQUIRED_USE="permashift? ( !naludump !pinplugin )"
-
-CONF_DIR="/etc/vdr"
-CAP_FILE="${S}/capabilities.sh"
-CAPS="# Capabilities of the vdr-executable for use by startscript etc."
-
-pkg_setup() {
-       use debug && append-flags -g
-
-       PLUGIN_LIBDIR="/usr/$(get_libdir)/vdr/plugins"
-       VIDEO_DIR="$(egethome vdr)/video"
-
-       tc-export CC CXX AR
-}
-
-add_cap() {
-       local arg
-       for arg; do
-               CAPS="${CAPS}\n${arg}=1"
-       done
-}
-
-lang_po() {
-       LING_PO=$( ls "${S}"/po | sed -e "s:.po::g" | cut -d_ -f1 | tr \\\012 ' 
' )
-}
-
-src_prepare() {
-       # apply maintenance-patches
-       ebegin "Changing paths for gentoo"
-
-       local DVBDIR=/usr/include
-       local i
-       for i in ${DVB_HEADER_PATH} /usr/include/v4l-dvb-hg /usr/include; do
-               [[ -d ${i} ]] || continue
-               if [[ -f ${i}/linux/dvb/dmx.h ]]; then
-                       einfo "Found DVB header files in ${i}"
-                       DVBDIR=${i}
-                       break
-               fi
-       done
-
-       # checking for s2api headers
-       local api_version
-       api_version=$(awk -F' ' '/define DVB_API_VERSION / {print $3}' 
"${DVBDIR}"/linux/dvb/version.h)
-       api_version=${api_version}*$(awk -F' ' '/define DVB_API_VERSION_MINOR / 
{print $3}' "${DVBDIR}"/linux/dvb/version.h)
-
-       if [[ ${api_version:-0} -lt 5*3 ]]; then
-               eerror "DVB header files do not contain s2api support or too 
old for ${P}"
-               eerror "You cannot compile VDR against old dvb-header"
-               die "DVB headers too old"
-       fi
-
-       cat > Make.config <<-EOT || die "cannot write to Make.config"
-               #
-               # Generated by ebuild ${PF}
-               #
-               PREFIX                  = /usr
-               DVBDIR                  = ${DVBDIR}
-               PLUGINLIBDIR    = ${PLUGIN_LIBDIR}
-               CONFDIR                 = ${CONF_DIR}
-               ARGSDIR                 = \$(CONFDIR)/conf.d
-               VIDEODIR                = ${VIDEO_DIR}
-               LOCDIR                  = \$(PREFIX)/share/locale
-               INCDIR                  = \$(PREFIX)/include
-
-               DEFINES                 += -DCONFDIR=\"\$(CONFDIR)\"
-               INCLUDES                += -I\$(DVBDIR)
-
-               # >=vdr-1.7.36-r1; parameter only used for compiletime on vdr
-               # PLUGINLIBDIR (plugin Makefile old) = LIBDIR (plugin Makefile 
new)
-               LIBDIR                  = ${PLUGIN_LIBDIR}
-               PCDIR                   = /usr/$(get_libdir)/pkgconfig
-
-       EOT
-       eend 0
-
-       eapply "${FILESDIR}/vdr-2.6.6_gentoo.patch"
-       use demoplugins || eapply "${FILESDIR}/vdr-2.4_remove_plugins.patch"
-       eapply "${FILESDIR}/${PN}-2.4.6_makefile-variables.patch"
-
-       # fix clang/LLVM compile
-       eapply "${FILESDIR}/${PN}-2.4.6_clang.patch"
-
-       use naludump && eapply "${FILESDIR}/${PN}-2.6.1_naludump.patch"
-       use permashift && eapply 
"${FILESDIR}/${PN}-2.6.1-patch-for-permashift.patch"
-       use pinplugin && eapply "${FILESDIR}/${PN}-2.6.7_pinplugin.patch"
-       use ttxtsubs && eapply "${DISTDIR}/${P}_ttxtsubs_v2.patch"
-       use menuorg && eapply "${DISTDIR}/vdr-menuorg-2.3.x.diff"
-       use mainmenuhooks && eapply 
"${FILESDIR}/${PN}-2.4.1_mainmenuhook-1.0.1.patch"
-
-       add_cap CAP_UTF8 \
-               CAP_IRCTRL_RUNTIME_PARAM \
-               CAP_VFAT_RUNTIME_PARAM \
-               CAP_CHUID \
-               CAP_SHUTDOWN_AUTO_RETRY
-
-       echo -e ${CAPS} > "${CAP_FILE}" || die "cannot write to CAP_FILE"
-
-       # LINGUAS support
-       einfo "\n \t VDR supports the LINGUAS values"
-
-       lang_po
-
-       einfo "\t Please set one of this values in your sytem make.conf"
-       einfo "\t LINGUAS=\"${LING_PO}\"\n"
-
-       if [[ -z ${LINGUAS} ]]; then
-               einfo "\n \t No values in LINGUAS="
-               einfo "\t You will get only english text on OSD \n"
-       fi
-
-       strip-linguas ${LING_PO} en
-
-       default
-}
-
-src_configure() {
-       # support languages, written from right to left
-       export "BIDI=$(usex bidi 1 0)"
-       # systemd notification support
-       export "SDNOTIFY=$(usex systemd 1 0)"
-       # with/without keyboard
-       export "USE_KBD=$(usex keyboard 1 0)"
-       # detailed compile output for debug
-       export "VERBOSE=$(usex verbose 1 0)"
-}
-
-src_install() {
-       # trick the makefile to not create a VIDEODIR by supplying it with an
-       # existing directory
-       emake VIDEODIR="/" DESTDIR="${ED}" install
-
-       keepdir "${PLUGIN_LIBDIR}"
-
-       # backup for plugins they don't be able to create this dir
-       keepdir "${CONF_DIR}/plugins"
-
-       if use html; then
-               local HTML_DOCS=( *.html )
-       fi
-       local DOCS=( MANUAL INSTALL README* HISTORY CONTRIBUTORS UPDATE-2* )
-       einstalldocs
-
-       insinto /usr/share/vdr
-       doins "${CAP_FILE}"
-
-       fowners vdr:vdr "${CONF_DIR}" -R
-}
-
-pkg_postinst() {
-       elog "Please read the /usr/share/doc/${PF}/UPDATE-2.4"
-       elog "for major changes in this version\n"
-
-       elog "It is a good idea to run vdrplugin-rebuild now.\n"
-
-       elog "To get nice symbols in OSD we recommend to install"
-       elog "\t1. emerge media-fonts/vdrsymbols-ttf"
-       elog "\t2. select font VDRSymbolsSans in Setup\n"
-
-       elog "To get an idea how to proceed now, have a look at our vdr-guide:"
-       elog "\thttps://wiki.gentoo.org/wiki/VDR";
-}

diff --git a/media-video/vdr/vdr-2.7.3.ebuild b/media-video/vdr/vdr-2.7.3.ebuild
deleted file mode 100644
index bf5158e8e8cc..000000000000
--- a/media-video/vdr/vdr-2.7.3.ebuild
+++ /dev/null
@@ -1,197 +0,0 @@
-# Copyright 2021-2024 Gentoo Authors
-# Distributed under the terms of the GNU General Public License v2
-
-EAPI=8
-
-inherit flag-o-matic strip-linguas toolchain-funcs user-info
-
-DESCRIPTION="Video Disk Recorder - turns a pc into a powerful set top box for 
DVB"
-HOMEPAGE="https://www.tvdr.de/";
-SRC_URI="https://git.tvdr.de/?p=vdr.git;a=snapshot;h=refs/tags/${PV};sf=tbz2 
-> ${P}.tbz2
-       menuorg? ( 
https://github.com/vdr-projects/vdr-plugin-menuorg/raw/master/vdr-patch/vdr-menuorg-2.3.x.diff
 )
-       ttxtsubs? ( https://md11.it.cx/download/${PN}/${P}_ttxtsubs_v2.patch )"
-
-LICENSE="GPL-2+"
-SLOT="0/5" # config.h: APIVERSION "5"
-KEYWORDS="~amd64 ~arm ~arm64 ~ppc ~x86"
-IUSE="bidi debug demoplugins keyboard mainmenuhooks menuorg naludump 
permashift pinplugin systemd ttxtsubs verbose"
-
-COMMON_DEPEND="
-       acct-group/vdr
-       acct-user/vdr
-       media-libs/fontconfig
-       media-libs/freetype
-       media-libs/libjpeg-turbo:=
-       sys-libs/libcap"
-DEPEND="${COMMON_DEPEND}
-       sys-kernel/linux-headers"
-RDEPEND="${COMMON_DEPEND}
-       dev-lang/perl
-       media-tv/gentoo-vdr-scripts
-       media-fonts/corefonts
-       bidi? ( dev-libs/fribidi )
-       systemd? ( sys-apps/systemd )"
-BDEPEND="
-       sys-devel/gettext
-       virtual/pkgconfig"
-
-REQUIRED_USE="permashift? ( !naludump !pinplugin )"
-
-CONF_DIR="/etc/vdr"
-CAP_FILE="${S}/capabilities.sh"
-CAPS="# Capabilities of the vdr-executable for use by startscript etc."
-
-pkg_setup() {
-       use debug && append-flags -g
-
-       PLUGIN_LIBDIR="/usr/$(get_libdir)/vdr/plugins"
-       VIDEO_DIR="$(egethome vdr)/video"
-
-       tc-export CC CXX AR
-}
-
-add_cap() {
-       local arg
-       for arg; do
-               CAPS="${CAPS}\n${arg}=1"
-       done
-}
-
-lang_po() {
-       LING_PO=$( ls "${S}"/po | sed -e "s:.po::g" | cut -d_ -f1 | tr \\\012 ' 
' )
-}
-
-src_prepare() {
-       # apply maintenance-patches
-       ebegin "Changing paths for gentoo"
-
-       local DVBDIR=/usr/include
-       local i
-       for i in ${DVB_HEADER_PATH} /usr/include/v4l-dvb-hg /usr/include; do
-               [[ -d ${i} ]] || continue
-               if [[ -f ${i}/linux/dvb/dmx.h ]]; then
-                       einfo "Found DVB header files in ${i}"
-                       DVBDIR=${i}
-                       break
-               fi
-       done
-
-       # checking for s2api headers
-       local api_version
-       api_version=$(awk -F' ' '/define DVB_API_VERSION / {print $3}' 
"${DVBDIR}"/linux/dvb/version.h)
-       api_version=${api_version}*$(awk -F' ' '/define DVB_API_VERSION_MINOR / 
{print $3}' "${DVBDIR}"/linux/dvb/version.h)
-
-       if [[ ${api_version:-0} -lt 5*3 ]]; then
-               eerror "DVB header files do not contain s2api support or too 
old for ${P}"
-               eerror "You cannot compile VDR against old dvb-header"
-               die "DVB headers too old"
-       fi
-
-       cat > Make.config <<-EOT || die "cannot write to Make.config"
-               #
-               # Generated by ebuild ${PF}
-               #
-               PREFIX                  = /usr
-               DVBDIR                  = ${DVBDIR}
-               PLUGINLIBDIR    = ${PLUGIN_LIBDIR}
-               CONFDIR                 = ${CONF_DIR}
-               ARGSDIR                 = \$(CONFDIR)/conf.d
-               VIDEODIR                = ${VIDEO_DIR}
-               LOCDIR                  = \$(PREFIX)/share/locale
-               INCDIR                  = \$(PREFIX)/include
-
-               DEFINES                 += -DCONFDIR=\"\$(CONFDIR)\"
-               INCLUDES                += -I\$(DVBDIR)
-
-               # >=vdr-1.7.36-r1; parameter only used for compiletime on vdr
-               # PLUGINLIBDIR (plugin Makefile old) = LIBDIR (plugin Makefile 
new)
-               LIBDIR                  = ${PLUGIN_LIBDIR}
-               PCDIR                   = /usr/$(get_libdir)/pkgconfig
-
-       EOT
-       eend 0
-
-       eapply "${FILESDIR}/vdr-2.6.6_gentoo.patch"
-       use demoplugins || eapply "${FILESDIR}/vdr-2.4_remove_plugins.patch"
-       eapply "${FILESDIR}/${PN}-2.4.6_makefile-variables.patch"
-
-       # fix clang/LLVM compile
-       eapply "${FILESDIR}/${PN}-2.4.6_clang.patch"
-
-       use naludump && eapply "${FILESDIR}/${PN}-2.6.1_naludump.patch"
-       use permashift && eapply 
"${FILESDIR}/${PN}-2.7.2-patch-for-permashift.patch"
-       use pinplugin && eapply "${FILESDIR}/${PN}-2.7.3_pinplugin.patch"
-       use ttxtsubs && eapply "${DISTDIR}/${P}_ttxtsubs_v2.patch"
-       use menuorg && eapply "${DISTDIR}/vdr-menuorg-2.3.x.diff"
-       use mainmenuhooks && eapply 
"${FILESDIR}/${PN}-2.4.1_mainmenuhook-1.0.1.patch"
-
-       add_cap CAP_UTF8 \
-               CAP_IRCTRL_RUNTIME_PARAM \
-               CAP_VFAT_RUNTIME_PARAM \
-               CAP_CHUID \
-               CAP_SHUTDOWN_AUTO_RETRY
-
-       echo -e ${CAPS} > "${CAP_FILE}" || die "cannot write to CAP_FILE"
-
-       # LINGUAS support
-       einfo "\n \t VDR supports the LINGUAS values"
-
-       lang_po
-
-       einfo "\t Please set one of this values in your sytem make.conf"
-       einfo "\t LINGUAS=\"${LING_PO}\"\n"
-
-       if [[ -z ${LINGUAS} ]]; then
-               einfo "\n \t No values in LINGUAS="
-               einfo "\t You will get only english text on OSD \n"
-       fi
-
-       strip-linguas ${LING_PO} en
-
-       default
-}
-
-src_configure() {
-       # support languages, written from right to left
-       export "BIDI=$(usex bidi 1 0)"
-       # systemd notification support
-       export "SDNOTIFY=$(usex systemd 1 0)"
-       # with/without keyboard
-       export "USE_KBD=$(usex keyboard 1 0)"
-       # detailed compile output for debug
-       export "VERBOSE=$(usex verbose 1 0)"
-}
-
-src_install() {
-       # trick the makefile to not create a VIDEODIR by supplying it with an
-       # existing directory
-       emake VIDEODIR="/" DESTDIR="${ED}" install
-
-       keepdir "${PLUGIN_LIBDIR}"
-
-       # backup for plugins they don't be able to create this dir
-       keepdir "${CONF_DIR}/plugins"
-
-       local HTML_DOCS=( *.html )
-       local DOCS=( MANUAL INSTALL README* HISTORY CONTRIBUTORS UPDATE-2* )
-       einstalldocs
-
-       insinto /usr/share/vdr
-       doins "${CAP_FILE}"
-
-       fowners vdr:vdr "${CONF_DIR}" -R
-}
-
-pkg_postinst() {
-       elog "Please read the /usr/share/doc/${PF}/UPDATE-2.4"
-       elog "for major changes in this version\n"
-
-       elog "It is a good idea to run vdrplugin-rebuild now.\n"
-
-       elog "To get nice symbols in OSD we recommend to install"
-       elog "\t1. emerge media-fonts/vdrsymbols-ttf"
-       elog "\t2. select font VDRSymbolsSans in Setup\n"
-
-       elog "To get an idea how to proceed now, have a look at our vdr-guide:"
-       elog "\thttps://wiki.gentoo.org/wiki/VDR";
-}

Reply via email to