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:
parent
6a8a2cf5fb
commit
00e2415b81
8
HISTORY
8
HISTORY
@ -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
6
ci.c
@ -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
49
ci.h
@ -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> {};
|
||||||
|
6
device.c
6
device.c
@ -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;
|
||||||
|
12
device.h
12
device.h
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user