1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Implemented cCamSlot::Decrypt()

This commit is contained in:
Klaus Schmidinger 2013-12-28 13:29:54 +01:00
parent 6a8a2cf5fb
commit 00e2415b81
6 changed files with 62 additions and 26 deletions

View File

@ -8089,3 +8089,11 @@ Video Disk Recorder Revision History
- Fixed some spellings in positioner.h and Doxyfile (thanks to Ville Skyttä). - Fixed some spellings in positioner.h and Doxyfile (thanks to Ville Skyttä).
- Changed '%a' to the POSIX compliant '%m' in all scanf() calls (thanks to Ville - Changed '%a' to the POSIX compliant '%m' in all scanf() calls (thanks to Ville
Skyttä). Skyttä).
- The new function cCamSlot::Decrypt() can be used by derived classes to implement a
CAM slot that can be freely assigned to any device, without being directly inserted
into the full TS data stream in hardware.
- Many member functions of cCamSlot have been made virtual to allow for easier
implementation of derived classes.
- cTSBuffer now provides the number of available bytes in its Get() function.
- cDvbDevice::GetTSPacket() now calls CamSlot()->Decrypt() in order to allow CAM slots
that can be freely assigned to any device access to the TS data stream.

6
ci.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: ci.c 2.12 2013/02/17 13:17:28 kls Exp $ * $Id: ci.c 3.1 2013/12/28 11:57:51 kls Exp $
*/ */
#include "ci.h" #include "ci.h"
@ -1983,6 +1983,10 @@ bool cCamSlot::IsDecrypting(void)
return false; return false;
} }
void cCamSlot::Decrypt(uchar *Data, int Count)
{
}
// --- cChannelCamRelation --------------------------------------------------- // --- cChannelCamRelation ---------------------------------------------------
#define CAM_CHECKED_TIMEOUT 15 // seconds before a CAM that has been checked for a particular channel will be checked again #define CAM_CHECKED_TIMEOUT 15 // seconds before a CAM that has been checked for a particular channel will be checked again

49
ci.h
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: ci.h 2.2 2012/02/29 10:24:27 kls Exp $ * $Id: ci.h 3.1 2013/12/28 13:20:08 kls Exp $
*/ */
#ifndef __CI_H #ifndef __CI_H
@ -169,50 +169,50 @@ public:
int SlotNumber(void) { return slotNumber; } int SlotNumber(void) { return slotNumber; }
///< Returns the number of this CAM slot within the whole system. ///< Returns the number of this CAM slot within the whole system.
///< The first slot has the number 1. ///< The first slot has the number 1.
bool Reset(void); virtual bool Reset(void);
///< Resets the CAM in this slot. ///< Resets the CAM in this slot.
///< Returns true if the operation was successful. ///< Returns true if the operation was successful.
eModuleStatus ModuleStatus(void); virtual eModuleStatus ModuleStatus(void);
///< Returns the status of the CAM in this slot. ///< Returns the status of the CAM in this slot.
const char *GetCamName(void); virtual const char *GetCamName(void);
///< Returns the name of the CAM in this slot, or NULL if there is ///< Returns the name of the CAM in this slot, or NULL if there is
///< no ready CAM in this slot. ///< no ready CAM in this slot.
bool Ready(void); virtual bool Ready(void);
///< Returns 'true' if the CAM in this slot is ready to decrypt. ///< Returns 'true' if the CAM in this slot is ready to decrypt.
bool HasMMI(void); virtual bool HasMMI(void);
///< Returns 'true' if the CAM in this slot has an active MMI. ///< Returns 'true' if the CAM in this slot has an active MMI.
bool HasUserIO(void); virtual bool HasUserIO(void);
///< Returns true if there is a pending user interaction, which shall ///< Returns true if there is a pending user interaction, which shall
///< be retrieved via GetMenu() or GetEnquiry(). ///< be retrieved via GetMenu() or GetEnquiry().
bool EnterMenu(void); virtual bool EnterMenu(void);
///< Requests the CAM in this slot to start its menu. ///< Requests the CAM in this slot to start its menu.
cCiMenu *GetMenu(void); virtual cCiMenu *GetMenu(void);
///< Gets a pending menu, or NULL if there is no menu. ///< Gets a pending menu, or NULL if there is no menu.
cCiEnquiry *GetEnquiry(void); virtual cCiEnquiry *GetEnquiry(void);
///< Gets a pending enquiry, or NULL if there is no enquiry. ///< Gets a pending enquiry, or NULL if there is no enquiry.
int Priority(void); int Priority(void);
///< Returns the priority if the device this slot is currently assigned ///< Returns the priority if the device this slot is currently assigned
///< to, or IDLEPRIORITY if it is not assigned to any device. ///< to, or IDLEPRIORITY if it is not assigned to any device.
bool ProvidesCa(const int *CaSystemIds); virtual bool ProvidesCa(const int *CaSystemIds);
///< Returns true if the CAM in this slot provides one of the given ///< Returns true if the CAM in this slot provides one of the given
///< CaSystemIds. This doesn't necessarily mean that it will be ///< CaSystemIds. This doesn't necessarily mean that it will be
///< possible to actually decrypt such a programme, since CAMs ///< possible to actually decrypt such a programme, since CAMs
///< usually advertise several CA system ids, while the actual ///< usually advertise several CA system ids, while the actual
///< decryption is controlled by the smart card inserted into ///< decryption is controlled by the smart card inserted into
///< the CAM. ///< the CAM.
void AddPid(int ProgramNumber, int Pid, int StreamType); virtual void AddPid(int ProgramNumber, int Pid, int StreamType);
///< Adds the given PID information to the list of PIDs. A later call ///< Adds the given PID information to the list of PIDs. A later call
///< to SetPid() will (de)activate one of these entries. ///< to SetPid() will (de)activate one of these entries.
void SetPid(int Pid, bool Active); virtual void SetPid(int Pid, bool Active);
///< Sets the given Pid (which has previously been added through a ///< Sets the given Pid (which has previously been added through a
///< call to AddPid()) to Active. A later call to StartDecrypting() will ///< call to AddPid()) to Active. A later call to StartDecrypting() will
///< send the full list of currently active CA_PMT entries to the CAM. ///< send the full list of currently active CA_PMT entries to the CAM.
void AddChannel(const cChannel *Channel); virtual void AddChannel(const cChannel *Channel);
///< Adds all PIDs if the given Channel to the current list of PIDs. ///< Adds all PIDs if the given Channel to the current list of PIDs.
///< If the source or transponder of the channel are different than ///< If the source or transponder of the channel are different than
///< what was given in a previous call to AddChannel(), any previously ///< what was given in a previous call to AddChannel(), any previously
///< added PIDs will be cleared. ///< added PIDs will be cleared.
bool CanDecrypt(const cChannel *Channel); virtual bool CanDecrypt(const cChannel *Channel);
///< Returns true if there is a CAM in this slot that is able to decrypt ///< Returns true if there is a CAM in this slot that is able to decrypt
///< the given Channel (or at least claims to be able to do so). ///< the given Channel (or at least claims to be able to do so).
///< Since the QUERY/REPLY mechanism for CAMs is pretty unreliable (some ///< Since the QUERY/REPLY mechanism for CAMs is pretty unreliable (some
@ -223,13 +223,26 @@ public:
///< to the initial QUERY will perform this check at all. CAMs that never ///< to the initial QUERY will perform this check at all. CAMs that never
///< replied to the initial QUERY are assumed not to be able to handle ///< replied to the initial QUERY are assumed not to be able to handle
///< more than one channel at a time. ///< more than one channel at a time.
void StartDecrypting(void); virtual void StartDecrypting(void);
///< Triggers sending all currently active CA_PMT entries to the CAM, ///< Triggers sending all currently active CA_PMT entries to the CAM,
///< so that it will start decrypting. ///< so that it will start decrypting.
void StopDecrypting(void); virtual void StopDecrypting(void);
///< Clears the list of CA_PMT entries and tells the CAM to stop decrypting. ///< Clears the list of CA_PMT entries and tells the CAM to stop decrypting.
bool IsDecrypting(void); virtual bool IsDecrypting(void);
///< Returns true if the CAM in this slot is currently used for decrypting. ///< Returns true if the CAM in this slot is currently used for decrypting.
virtual void Decrypt(uchar *Data, int Count);
///< If this is a CAM slot that can be freely assigned to any device,
///< but will not be directly inserted into the full TS data stream
///< in hardware, it can implement this function to be given access
///< to the data in the device's TS buffer. Data points to a buffer
///< of Count bytes of TS packets. The first byte in Data is guaranteed
///< to be a TS_SYNC_BYTE. This function may decrypt as many TS packets
///< in Data as it wants, but it must decrypt at least the very first
///< TS packet. Only this very first TS packet will be further processed
///< after the call to this function. The next call will be done with
///< Data pointing to the TS packet immediately following the previous
///< one. However, it can not be assumed that a call to Decrypt() with
///< a Data pointer of P will be followed by a call with P + TS_SIZE.
}; };
class cCamSlots : public cList<cCamSlot> {}; class cCamSlots : public cList<cCamSlot> {};

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.c 3.4 2013/12/25 13:20:19 kls Exp $ * $Id: device.c 3.5 2013/12/28 12:56:24 kls Exp $
*/ */
#include "device.h" #include "device.h"
@ -1764,7 +1764,7 @@ void cTSBuffer::Action(void)
} }
} }
uchar *cTSBuffer::Get(void) uchar *cTSBuffer::Get(int *Available)
{ {
int Count = 0; int Count = 0;
if (delivered) { if (delivered) {
@ -1785,6 +1785,8 @@ uchar *cTSBuffer::Get(void)
return NULL; return NULL;
} }
delivered = true; delivered = true;
if (Available)
*Available = Count;
return p; return p;
} }
return NULL; return NULL;

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: device.h 3.6 2013/12/25 13:53:35 kls Exp $ * $Id: device.h 3.7 2013/12/28 12:59:13 kls Exp $
*/ */
#ifndef __DEVICE_H #ifndef __DEVICE_H
@ -829,8 +829,14 @@ private:
virtual void Action(void); virtual void Action(void);
public: public:
cTSBuffer(int File, int Size, int CardIndex); cTSBuffer(int File, int Size, int CardIndex);
~cTSBuffer(); virtual ~cTSBuffer();
uchar *Get(void); uchar *Get(int *Available = NULL);
///< Returns a pointer to the first TS packet in the buffer. If Available is given,
///< it will return the total number of consecutive bytes pointed to in the buffer.
///< It is guaranteed that the returned pointer points to a TS_SYNC_BYTE and that
///< there are at least TS_SIZE bytes in the buffer. Otherwise NULL will be
///< returned and the value in Available (if given) is undefined.
///< Each call to Get() returns a pointer to the next TS packet in the buffer.
}; };
#endif //__DEVICE_H #endif //__DEVICE_H

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: dvbdevice.c 3.5 2013/10/21 08:59:59 kls Exp $ * $Id: dvbdevice.c 3.6 2013/12/28 13:21:37 kls Exp $
*/ */
#include "dvbdevice.h" #include "dvbdevice.h"
@ -1668,7 +1668,10 @@ void cDvbDevice::CloseDvr(void)
bool cDvbDevice::GetTSPacket(uchar *&Data) bool cDvbDevice::GetTSPacket(uchar *&Data)
{ {
if (tsBuffer) { if (tsBuffer) {
Data = tsBuffer->Get(); int Available;
Data = tsBuffer->Get(&Available);
if (Data && CamSlot())
CamSlot()->Decrypt(Data, Available);
return true; return true;
} }
return false; return false;