mirror of
https://projects.vdr-developer.org/git/vdr-plugin-streamdev.git
synced 2023-10-10 19:16:51 +02:00
Added vdr-1.6.0-intcamdevices.patch (#429)
Modified Files: HISTORY README client/device.h Added Files: patches/vdr-1.6.0-intcamdevices.patch
This commit is contained in:
parent
924cf6e4d0
commit
42474b8431
1
HISTORY
1
HISTORY
@ -1,6 +1,7 @@
|
|||||||
VDR Plugin 'streamdev' Revision History
|
VDR Plugin 'streamdev' Revision History
|
||||||
---------------------------------------
|
---------------------------------------
|
||||||
|
|
||||||
|
- added vdr-1.6.0-intcamdevices.patch (thanks to Anssi Hannula)
|
||||||
- fixed problem when switching from one encrypted channel to an other
|
- fixed problem when switching from one encrypted channel to an other
|
||||||
(reported by Tiroler@vdrportal, initial bugfix by pixelpeter@vdrportal)
|
(reported by Tiroler@vdrportal, initial bugfix by pixelpeter@vdrportal)
|
||||||
- added preprocessor directive for ancient gcc
|
- added preprocessor directive for ancient gcc
|
||||||
|
8
README
8
README
@ -344,5 +344,9 @@ also have to disable automatic channel updates on the client or (if streamdev
|
|||||||
is the only DVB source) disable streamdev's filter streaming feature. Otherwise
|
is the only DVB source) disable streamdev's filter streaming feature. Otherwise
|
||||||
VDR will revert the channel into an encrypted one.
|
VDR will revert the channel into an encrypted one.
|
||||||
|
|
||||||
3. Apply the patch "patches/vdr-1.6.0-ignore_missing_cam.diff" to your
|
3. Apply either patch "patches/vdr-1.6.0-intcamdevices.patch" or patch
|
||||||
client VDR.
|
"patches/vdr-1.6.0-ignore_missing_cam.diff" to your client VDR. Intcamdevices
|
||||||
|
is the clean solution. But as it modifies the VDR API, so you will need to
|
||||||
|
recompile all of your plugins. The ignore_missing_cam patch is trivial, no need
|
||||||
|
to recompile other plugins. However it is not suitable for clients with a DVB
|
||||||
|
card of their own.
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: device.h,v 1.7 2008/04/07 14:40:39 schmirl Exp $
|
* $Id: device.h,v 1.8 2008/10/02 07:14:47 schmirl Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef VDR_STREAMDEV_DEVICE_H
|
#ifndef VDR_STREAMDEV_DEVICE_H
|
||||||
@ -49,6 +49,7 @@ public:
|
|||||||
cStreamdevDevice(void);
|
cStreamdevDevice(void);
|
||||||
virtual ~cStreamdevDevice();
|
virtual ~cStreamdevDevice();
|
||||||
|
|
||||||
|
virtual bool HasInternalCam(void) { return true; }
|
||||||
virtual bool ProvidesSource(int Source) const;
|
virtual bool ProvidesSource(int Source) const;
|
||||||
virtual bool ProvidesTransponder(const cChannel *Channel) const;
|
virtual bool ProvidesTransponder(const cChannel *Channel) const;
|
||||||
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1,
|
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = -1,
|
||||||
|
78
patches/vdr-1.6.0-intcamdevices.patch
Normal file
78
patches/vdr-1.6.0-intcamdevices.patch
Normal file
@ -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; }
|
||||||
|
|
Loading…
Reference in New Issue
Block a user