summaryrefslogtreecommitdiff
path: root/plugins/streamdev/streamdev-cvs/patches
diff options
context:
space:
mode:
authorkwacker <vdr@w-i-r.com>2010-04-11 13:46:11 +0200
committerkwacker <vdr@w-i-r.com>2010-04-11 13:46:11 +0200
commit9b144d30e0ea8ce900c37b96ba2cbdda14b0ae88 (patch)
tree3a52de029f950dcd9f9856a53fd67abef8519e68 /plugins/streamdev/streamdev-cvs/patches
parent9cd931834ecadbf5efefdf484abb966e9248ebbb (diff)
downloadx-vdr-9b144d30e0ea8ce900c37b96ba2cbdda14b0ae88.tar.gz
x-vdr-9b144d30e0ea8ce900c37b96ba2cbdda14b0ae88.tar.bz2
Burn 0.2.0-beta3 und Streamdev mit Paches aktualisiert
Diffstat (limited to 'plugins/streamdev/streamdev-cvs/patches')
-rw-r--r--plugins/streamdev/streamdev-cvs/patches/CVS/Entries7
-rw-r--r--plugins/streamdev/streamdev-cvs/patches/CVS/Repository1
-rw-r--r--plugins/streamdev/streamdev-cvs/patches/CVS/Root1
-rw-r--r--plugins/streamdev/streamdev-cvs/patches/vdr-1.4.3-recursion.diff85
-rw-r--r--plugins/streamdev/streamdev-cvs/patches/vdr-1.4.3-recursion_bigpatch.diff88
-rw-r--r--plugins/streamdev/streamdev-cvs/patches/vdr-1.4.x-localchannelprovide.diff102
-rw-r--r--plugins/streamdev/streamdev-cvs/patches/vdr-1.6.0-ignore_missing_cam.diff13
-rw-r--r--plugins/streamdev/streamdev-cvs/patches/vdr-1.6.0-intcamdevices.patch78
-rw-r--r--plugins/streamdev/streamdev-cvs/patches/vdr-cap_net_raw.diff11
9 files changed, 386 insertions, 0 deletions
diff --git a/plugins/streamdev/streamdev-cvs/patches/CVS/Entries b/plugins/streamdev/streamdev-cvs/patches/CVS/Entries
new file mode 100644
index 0000000..820adef
--- /dev/null
+++ b/plugins/streamdev/streamdev-cvs/patches/CVS/Entries
@@ -0,0 +1,7 @@
+/vdr-1.4.3-recursion.diff/1.1/Thu Jan 11 11:48:23 2007//
+/vdr-1.4.3-recursion_bigpatch.diff/1.1/Thu Jan 11 11:48:23 2007//
+/vdr-1.4.x-localchannelprovide.diff/1.1/Thu Jan 11 11:44:01 2007//
+/vdr-1.6.0-ignore_missing_cam.diff/1.1/Tue Apr 8 14:18:17 2008//
+/vdr-1.6.0-intcamdevices.patch/1.1/Thu Oct 2 07:14:48 2008//
+/vdr-cap_net_raw.diff/1.1/Fri Feb 13 10:39:21 2009//
+D
diff --git a/plugins/streamdev/streamdev-cvs/patches/CVS/Repository b/plugins/streamdev/streamdev-cvs/patches/CVS/Repository
new file mode 100644
index 0000000..b4967d6
--- /dev/null
+++ b/plugins/streamdev/streamdev-cvs/patches/CVS/Repository
@@ -0,0 +1 @@
+streamdev/patches
diff --git a/plugins/streamdev/streamdev-cvs/patches/CVS/Root b/plugins/streamdev/streamdev-cvs/patches/CVS/Root
new file mode 100644
index 0000000..2c7f6ce
--- /dev/null
+++ b/plugins/streamdev/streamdev-cvs/patches/CVS/Root
@@ -0,0 +1 @@
+:pserver:anoncvs@vdr-developer.org:/var/cvsroot
diff --git a/plugins/streamdev/streamdev-cvs/patches/vdr-1.4.3-recursion.diff b/plugins/streamdev/streamdev-cvs/patches/vdr-1.4.3-recursion.diff
new file mode 100644
index 0000000..7a06c92
--- /dev/null
+++ b/plugins/streamdev/streamdev-cvs/patches/vdr-1.4.3-recursion.diff
@@ -0,0 +1,85 @@
+# If you have two or more VDRs and you like them to mutually share
+# there DVB cards you might need to apply this patch first.
+#
+# IMPORTANT: As this patch does not only modify streamdev-server but
+# also an exported method of VDR, you will need to
+#
+# !!!!! RECOMPILE VDR AND ALL PLUGINS !!!!!
+#
+# Why do I need the patch?
+# --------------------------
+# Before switching channels VDR will consider all of its devices to
+# find the one with the least impact. This includes the device provided
+# by the streamdev-client plugin. Streamdev-client will forward the
+# request to its server which in turn checks all of its devices. Now if
+# the server is running streamdev-client, too, the request will again
+# be forwarded to its server and finally you will endup in a loop.
+#
+# What does the patch do?
+# -----------------------
+# The patch adds the additional parameter "bool DVBCardsOnly" to VDR's
+# device selection method cDevice::GetDevice(...). The parameter
+# defaults to false which gives you the standard behaviour of GetDevice.
+# When set to true, GetDevice will use only those devices with a card
+# index < MAXDVBDEVICES, so only real DVB cards will be considered.
+# Other devices like streamdev-client or DVB cards provided by plugin
+# (Hauppauge PVR) won't be used.
+#
+# Author: Frank Schmirler (http://vdr.schmirler.de)
+#
+--- device.h.orig 2006-11-15 12:01:34.000000000 +0100
++++ device.h 2006-11-15 12:02:15.000000000 +0100
+@@ -128,7 +128,7 @@
+ ///< Gets the device with the given Index.
+ ///< \param Index must be in the range 0..numDevices-1.
+ ///< \return A pointer to the device, or NULL if the Index was invalid.
+- static cDevice *GetDevice(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL);
++ static cDevice *GetDevice(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL, bool DVBCardsOnly = false);
+ ///< Returns a device that is able to receive the given Channel at the
+ ///< given Priority, with the least impact on active recordings and
+ ///< live viewing.
+--- device.c.orig 2006-11-15 12:01:30.000000000 +0100
++++ device.c 2006-11-22 12:28:05.000000000 +0100
+@@ -8,6 +8,7 @@
+ */
+
+ #include "device.h"
++#include "dvbdevice.h"
+ #include <errno.h>
+ #include <sys/ioctl.h>
+ #include <sys/mman.h>
+@@ -278,11 +279,13 @@
+ return (0 <= Index && Index < numDevices) ? device[Index] : NULL;
+ }
+
+-cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers)
++cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers, bool DVBCardsOnly)
+ {
+ cDevice *d = NULL;
+ uint Impact = 0xFFFFFFFF; // we're looking for a device with the least impact
+ for (int i = 0; i < numDevices; i++) {
++ if (DVBCardsOnly && device[i]->CardIndex() >= MAXDVBDEVICES)
++ continue;
+ bool ndr;
+ if (device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basicly able to do the job
+ // Put together an integer number that reflects the "impact" using
+--- PLUGINS/src/streamdev/server/connection.c.orig 2006-11-15 12:10:11.000000000 +0100
++++ PLUGINS/src/streamdev/server/connection.c 2006-11-15 12:10:59.000000000 +0100
+@@ -132,7 +132,7 @@
+ Dprintf(" * GetDevice(const cChannel*, int)\n");
+ Dprintf(" * -------------------------------\n");
+
+- device = cDevice::GetDevice(Channel, Priority);
++ device = cDevice::GetDevice(Channel, Priority, NULL, true);
+
+ Dprintf(" * Found following device: %p (%d)\n", device,
+ device ? device->CardIndex() + 1 : 0);
+@@ -150,7 +150,7 @@
+ const cChannel *current = Channels.GetByNumber(cDevice::CurrentChannel());
+ isyslog("streamdev-server: Detaching current receiver");
+ Detach();
+- device = cDevice::GetDevice(Channel, Priority);
++ device = cDevice::GetDevice(Channel, Priority, NULL, true);
+ Attach();
+ Dprintf(" * Found following device: %p (%d)\n", device,
+ device ? device->CardIndex() + 1 : 0);
diff --git a/plugins/streamdev/streamdev-cvs/patches/vdr-1.4.3-recursion_bigpatch.diff b/plugins/streamdev/streamdev-cvs/patches/vdr-1.4.3-recursion_bigpatch.diff
new file mode 100644
index 0000000..5bb7854
--- /dev/null
+++ b/plugins/streamdev/streamdev-cvs/patches/vdr-1.4.3-recursion_bigpatch.diff
@@ -0,0 +1,88 @@
+# If you have two or more VDRs and you like them to mutually share
+# there DVB cards you might need to apply this patch first.
+#
+# This is a modified version of the patch for VDRs with BIGPATCH.
+# Thanks to p_body@vdrportal.
+#
+# IMPORTANT: As this patch does not only modify streamdev-server but
+# also an exported method of VDR, you will need to
+#
+# !!!!! RECOMPILE VDR AND ALL PLUGINS !!!!!
+#
+# Why do I need the patch?
+# --------------------------
+# Before switching channels VDR will consider all of its devices to
+# find the one with the least impact. This includes the device provided
+# by the streamdev-client plugin. Streamdev-client will forward the
+# request to its server which in turn checks all of its devices. Now if
+# the server is running streamdev-client, too, the request will again
+# be forwarded to its server and finally you will endup in a loop.
+#
+# What does the patch do?
+# -----------------------
+# The patch adds the additional parameter "bool DVBCardsOnly" to VDR's
+# device selection method cDevice::GetDevice(...). The parameter
+# defaults to false which gives you the standard behaviour of GetDevice.
+# When set to true, GetDevice will use only those devices with a card
+# index < MAXDVBDEVICES, so only real DVB cards will be considered.
+# Other devices like streamdev-client or DVB cards provided by plugin
+# (Hauppauge PVR) won't be used.
+#
+# Author: Frank Schmirler (http://vdr.schmirler.de)
+#
+--- device.h.orig 2006-11-15 12:01:34.000000000 +0100
++++ device.h 2006-11-15 12:02:15.000000000 +0100
+@@ -128,7 +128,7 @@
+ ///< Gets the device with the given Index.
+ ///< \param Index must be in the range 0..numDevices-1.
+ ///< \return A pointer to the device, or NULL if the Index was invalid.
+- static cDevice *GetDevice(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL, bool LiveView = false);
++ static cDevice *GetDevice(const cChannel *Channel, int Priority = -1, bool *NeedsDetachReceivers = NULL, bool LiveView = false, bool DVBCardsOnly = false);
+ ///< Returns a device that is able to receive the given Channel at the
+ ///< given Priority, with the least impact on active recordings and
+ ///< live viewing.
+--- device.c.orig 2006-11-15 12:01:30.000000000 +0100
++++ device.c 2006-11-22 12:28:05.000000000 +0100
+@@ -8,6 +8,7 @@
+ */
+
+ #include "device.h"
++#include "dvbdevice.h"
+ #include <errno.h>
+ #include <sys/ioctl.h>
+ #include <sys/mman.h>
+@@ -278,11 +279,13 @@
+ return (0 <= Index && Index < numDevices) ? device[Index] : NULL;
+ }
+
+-cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers, bool LiveView)
++cDevice *cDevice::GetDevice(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers, bool LiveView, bool DVBCardsOnly)
+ {
+ cDevice *d = NULL;
+ uint Impact = 0xFFFFFFFF; // we're looking for a device with the least impact
+ for (int i = 0; i < numDevices; i++) {
++ if (DVBCardsOnly && device[i]->CardIndex() >= MAXDVBDEVICES)
++ continue;
+ bool ndr;
+ if (device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basicly able to do the job
+ // Put together an integer number that reflects the "impact" using
+--- PLUGINS/src/streamdev/server/connection.c.orig 2006-11-15 12:10:11.000000000 +0100
++++ PLUGINS/src/streamdev/server/connection.c 2006-11-15 12:10:59.000000000 +0100
+@@ -132,7 +132,7 @@
+ Dprintf(" * GetDevice(const cChannel*, int)\n");
+ Dprintf(" * -------------------------------\n");
+
+- device = cDevice::GetDevice(Channel, Priority);
++ device = cDevice::GetDevice(Channel, Priority, NULL, NULL, true);
+
+ Dprintf(" * Found following device: %p (%d)\n", device,
+ device ? device->CardIndex() + 1 : 0);
+@@ -150,7 +150,7 @@
+ const cChannel *current = Channels.GetByNumber(cDevice::CurrentChannel());
+ isyslog("streamdev-server: Detaching current receiver");
+ Detach();
+- device = cDevice::GetDevice(Channel, Priority);
++ device = cDevice::GetDevice(Channel, Priority, NULL, NULL, true);
+ Attach();
+ Dprintf(" * Found following device: %p (%d)\n", device,
+ device ? device->CardIndex() + 1 : 0);
diff --git a/plugins/streamdev/streamdev-cvs/patches/vdr-1.4.x-localchannelprovide.diff b/plugins/streamdev/streamdev-cvs/patches/vdr-1.4.x-localchannelprovide.diff
new file mode 100644
index 0000000..857c1a2
--- /dev/null
+++ b/plugins/streamdev/streamdev-cvs/patches/vdr-1.4.x-localchannelprovide.diff
@@ -0,0 +1,102 @@
+# Apply this patch to VDR if you want to use a fullfeatured DVB card
+# as pure output device. Infact the patch will keep VDR from using the
+# tuner of any local DVB card (also budget cards). It will not affect
+# other input devices like e.g. streamdev-client or DVB cards provided
+# by plugins (e.g. Hauppauge PVR).
+#
+# By default the patch is DISABLED. There will be a new OSD menu entry
+# in Setup->DVB which allows you to enable or disable the patch at any
+# time.
+diff -ru vdr-1.4.3.orig/config.c vdr-1.4.3/config.c
+--- vdr-1.4.3.orig/config.c 2006-07-22 13:57:51.000000000 +0200
++++ vdr-1.4.3/config.c 2006-11-16 08:16:37.000000000 +0100
+@@ -273,6 +273,7 @@
+ CurrentChannel = -1;
+ CurrentVolume = MAXVOLUME;
+ CurrentDolby = 0;
++ LocalChannelProvide = 1;
+ InitialChannel = 0;
+ InitialVolume = -1;
+ }
+@@ -434,6 +435,7 @@
+ else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value);
+ else if (!strcasecmp(Name, "CurrentVolume")) CurrentVolume = atoi(Value);
+ else if (!strcasecmp(Name, "CurrentDolby")) CurrentDolby = atoi(Value);
++ else if (!strcasecmp(Name, "LocalChannelProvide")) LocalChannelProvide = atoi(Value);
+ else if (!strcasecmp(Name, "InitialChannel")) InitialChannel = atoi(Value);
+ else if (!strcasecmp(Name, "InitialVolume")) InitialVolume = atoi(Value);
+ else
+@@ -502,6 +504,7 @@
+ Store("CurrentChannel", CurrentChannel);
+ Store("CurrentVolume", CurrentVolume);
+ Store("CurrentDolby", CurrentDolby);
++ Store("LocalChannelProvide",LocalChannelProvide);
+ Store("InitialChannel", InitialChannel);
+ Store("InitialVolume", InitialVolume);
+
+diff -ru vdr-1.4.3.orig/config.h vdr-1.4.3/config.h
+--- vdr-1.4.3.orig/config.h 2006-09-23 15:56:08.000000000 +0200
++++ vdr-1.4.3/config.h 2006-11-16 08:16:57.000000000 +0100
+@@ -250,6 +250,7 @@
+ int CurrentChannel;
+ int CurrentVolume;
+ int CurrentDolby;
++ int LocalChannelProvide;
+ int InitialChannel;
+ int InitialVolume;
+ int __EndData__;
+diff -ru vdr-1.4.3.orig/dvbdevice.c vdr-1.4.3/dvbdevice.c
+--- vdr-1.4.3.orig/dvbdevice.c 2006-08-14 11:38:32.000000000 +0200
++++ vdr-1.4.3/dvbdevice.c 2006-11-16 08:17:58.000000000 +0100
+@@ -766,6 +766,8 @@
+
+ bool cDvbDevice::ProvidesChannel(const cChannel *Channel, int Priority, bool *NeedsDetachReceivers) const
+ {
++ if (Setup.LocalChannelProvide != 1)
++ return false;
+ bool result = false;
+ bool hasPriority = Priority < 0 || Priority > this->Priority();
+ bool needsDetachReceivers = false;
+diff -ru vdr-1.4.3.orig/i18n.c vdr-1.4.3/i18n.c
+--- vdr-1.4.3.orig/i18n.c 2006-09-16 11:08:30.000000000 +0200
++++ vdr-1.4.3/i18n.c 2006-11-16 08:36:53.000000000 +0100
+@@ -3546,6 +3546,28 @@
+ "Foretrukket sprog",
+ "Preferovaný jazyk",
+ },
++ { "Setup.DVB$Use DVB receivers",
++ "DVB Empfangsteile benutzen",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ "",
++ },
+ { "Setup.DVB$Primary DVB interface",
+ "Primäres DVB-Interface",
+ "Primarna naprava",
+diff -ru vdr-1.4.3.orig/menu.c vdr-1.4.3/menu.c
+--- vdr-1.4.3.orig/menu.c 2006-07-23 11:23:11.000000000 +0200
++++ vdr-1.4.3/menu.c 2006-11-16 08:37:27.000000000 +0100
+@@ -2354,6 +2354,7 @@
+
+ Clear();
+
++ Add(new cMenuEditBoolItem(tr("Setup.DVB$Use DVB receivers"), &data.LocalChannelProvide));
+ Add(new cMenuEditIntItem( tr("Setup.DVB$Primary DVB interface"), &data.PrimaryDVB, 1, cDevice::NumDevices()));
+ Add(new cMenuEditBoolItem(tr("Setup.DVB$Video format"), &data.VideoFormat, "4:3", "16:9"));
+ if (data.VideoFormat == 0)
diff --git a/plugins/streamdev/streamdev-cvs/patches/vdr-1.6.0-ignore_missing_cam.diff b/plugins/streamdev/streamdev-cvs/patches/vdr-1.6.0-ignore_missing_cam.diff
new file mode 100644
index 0000000..60d93bd
--- /dev/null
+++ b/plugins/streamdev/streamdev-cvs/patches/vdr-1.6.0-ignore_missing_cam.diff
@@ -0,0 +1,13 @@
+--- device.c.orig 2008-03-28 11:47:25.000000000 +0100
++++ device.c 2008-03-28 11:47:09.000000000 +0100
+@@ -375,8 +375,8 @@
+ }
+ }
+ }
+- if (!NumUsableSlots)
+- return NULL; // no CAM is able to decrypt this channel
++// if (!NumUsableSlots)
++// return NULL; // no CAM is able to decrypt this channel
+ }
+
+ bool NeedsDetachReceivers = false;
diff --git a/plugins/streamdev/streamdev-cvs/patches/vdr-1.6.0-intcamdevices.patch b/plugins/streamdev/streamdev-cvs/patches/vdr-1.6.0-intcamdevices.patch
new file mode 100644
index 0000000..aab1fb4
--- /dev/null
+++ b/plugins/streamdev/streamdev-cvs/patches/vdr-1.6.0-intcamdevices.patch
@@ -0,0 +1,78 @@
+Index: vdr-1.6.0-nocamdevices/device.c
+===================================================================
+--- vdr-1.6.0-nocamdevices/device.c
++++ vdr-1.6.0-nocamdevices/device.c 2008-04-27 18:55:37.000000000 +0300
+@@ -363,6 +363,7 @@
+ int NumCamSlots = CamSlots.Count();
+ int SlotPriority[NumCamSlots];
+ int NumUsableSlots = 0;
++ bool InternalCamNeeded = false;
+ if (Channel->Ca() >= CA_ENCRYPTED_MIN) {
+ for (cCamSlot *CamSlot = CamSlots.First(); CamSlot; CamSlot = CamSlots.Next(CamSlot)) {
+ SlotPriority[CamSlot->Index()] = MAXPRIORITY + 1; // assumes it can't be used
+@@ -376,7 +377,7 @@
+ }
+ }
+ if (!NumUsableSlots)
+- return NULL; // no CAM is able to decrypt this channel
++ InternalCamNeeded = true; // no CAM is able to decrypt this channel
+ }
+
+ bool NeedsDetachReceivers = false;
+@@ -392,11 +393,13 @@
+ continue; // this device shall be temporarily avoided
+ if (Channel->Ca() && Channel->Ca() <= CA_DVB_MAX && Channel->Ca() != device[i]->CardIndex() + 1)
+ continue; // a specific card was requested, but not this one
+- if (NumUsableSlots && !CamSlots.Get(j)->Assign(device[i], true))
++ if (InternalCamNeeded && !device[i]->HasInternalCam())
++ continue; // no CAM is able to decrypt this channel and the device uses vdr handled CAMs
++ if (NumUsableSlots && !device[i]->HasInternalCam() && !CamSlots.Get(j)->Assign(device[i], true))
+ continue; // CAM slot can't be used with this device
+ bool ndr;
+ if (device[i]->ProvidesChannel(Channel, Priority, &ndr)) { // this device is basicly able to do the job
+- if (NumUsableSlots && device[i]->CamSlot() && device[i]->CamSlot() != CamSlots.Get(j))
++ if (NumUsableSlots && !device[i]->HasInternalCam() && device[i]->CamSlot() && device[i]->CamSlot() != CamSlots.Get(j))
+ ndr = true; // using a different CAM slot requires detaching receivers
+ // Put together an integer number that reflects the "impact" using
+ // this device would have on the overall system. Each condition is represented
+@@ -410,18 +413,18 @@
+ imp <<= 1; imp |= device[i]->Receiving(); // avoid devices that are receiving
+ imp <<= 1; imp |= device[i] == cTransferControl::ReceiverDevice(); // avoid the Transfer Mode receiver device
+ imp <<= 8; imp |= min(max(device[i]->Priority() + MAXPRIORITY, 0), 0xFF); // use the device with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used)
+- imp <<= 8; imp |= min(max((NumUsableSlots ? SlotPriority[j] : 0) + MAXPRIORITY, 0), 0xFF); // use the CAM slot with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used)
++ imp <<= 8; imp |= min(max(((NumUsableSlots && !device[i]->HasInternalCam()) ? SlotPriority[j] : 0) + MAXPRIORITY, 0), 0xFF); // use the CAM slot with the lowest priority (+MAXPRIORITY to assure that values -99..99 can be used)
+ imp <<= 1; imp |= ndr; // avoid devices if we need to detach existing receivers
+ imp <<= 1; imp |= device[i]->IsPrimaryDevice(); // avoid the primary device
+- imp <<= 1; imp |= NumUsableSlots ? 0 : device[i]->HasCi(); // avoid cards with Common Interface for FTA channels
++ imp <<= 1; imp |= (NumUsableSlots || InternalCamNeeded) ? 0 : device[i]->HasCi(); // avoid cards with Common Interface for FTA channels
+ imp <<= 1; imp |= device[i]->HasDecoder(); // avoid full featured cards
+- imp <<= 1; imp |= NumUsableSlots ? !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), j + 1) : 0; // prefer CAMs that are known to decrypt this channel
++ imp <<= 1; imp |= (NumUsableSlots && !device[i]->HasInternalCam()) ? !ChannelCamRelations.CamDecrypt(Channel->GetChannelID(), j + 1) : 0; // prefer CAMs that are known to decrypt this channel
+ if (imp < Impact) {
+ // This device has less impact than any previous one, so we take it.
+ Impact = imp;
+ d = device[i];
+ NeedsDetachReceivers = ndr;
+- if (NumUsableSlots)
++ if (NumUsableSlots && !device[i]->HasInternalCam())
+ s = CamSlots.Get(j);
+ }
+ }
+Index: vdr-1.6.0-nocamdevices/device.h
+===================================================================
+--- vdr-1.6.0-nocamdevices/device.h
++++ vdr-1.6.0-nocamdevices/device.h 2008-04-27 18:55:49.000000000 +0300
+@@ -335,6 +335,12 @@
+ public:
+ virtual bool HasCi(void);
+ ///< Returns true if this device has a Common Interface.
++ virtual bool HasInternalCam(void) { return false; }
++ ///< Returns true if this device handles encrypted channels itself
++ ///< without VDR assistance. This can be e.g. when the device is a
++ ///< client that gets the stream from another VDR instance that has
++ ///< already decrypted the stream. In this case ProvidesChannel()
++ ///< shall check whether the channel can be decrypted.
+ void SetCamSlot(cCamSlot *CamSlot);
+ ///< Sets the given CamSlot to be used with this device.
+ cCamSlot *CamSlot(void) const { return camSlot; }
+
diff --git a/plugins/streamdev/streamdev-cvs/patches/vdr-cap_net_raw.diff b/plugins/streamdev/streamdev-cvs/patches/vdr-cap_net_raw.diff
new file mode 100644
index 0000000..2f714b1
--- /dev/null
+++ b/plugins/streamdev/streamdev-cvs/patches/vdr-cap_net_raw.diff
@@ -0,0 +1,11 @@
+--- vdr.c.orig 2009-02-13 09:45:55.000000000 +0100
++++ vdr.c 2009-02-13 09:46:24.000000000 +0100
+@@ -115,7 +115,7 @@
+ static bool SetCapSysTime(void)
+ {
+ // drop all capabilities except cap_sys_time
+- cap_t caps = cap_from_text("= cap_sys_time=ep");
++ cap_t caps = cap_from_text("= cap_sys_time,cap_net_raw=ep");
+ if (!caps) {
+ fprintf(stderr, "vdr: cap_from_text failed: %s\n", strerror(errno));
+ return false;