mirror of
				https://projects.vdr-developer.org/git/vdr-plugin-streamdev.git
				synced 2023-10-10 17:16:51 +00: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:
		
							
								
								
									
										1
									
								
								HISTORY
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								HISTORY
									
									
									
									
									
								
							| @@ -1,6 +1,7 @@ | ||||
| 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 | ||||
|   (reported by Tiroler@vdrportal, initial bugfix by pixelpeter@vdrportal) | ||||
| - 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 | ||||
| VDR will revert the channel into an encrypted one. | ||||
|  | ||||
| 3. Apply the patch "patches/vdr-1.6.0-ignore_missing_cam.diff" to your | ||||
| client VDR. | ||||
| 3. Apply either patch "patches/vdr-1.6.0-intcamdevices.patch" or patch | ||||
| "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 | ||||
| @@ -49,6 +49,7 @@ public: | ||||
| 	cStreamdevDevice(void); | ||||
| 	virtual ~cStreamdevDevice(); | ||||
|  | ||||
| 	virtual bool HasInternalCam(void) { return true; } | ||||
| 	virtual bool ProvidesSource(int Source) const; | ||||
| 	virtual bool ProvidesTransponder(const cChannel *Channel) const; | ||||
| 	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; } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user