⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vdr-1.4.x-sc7.diff

📁 这是一个LINUX环境的 VDR 插件源代码,可支持Irdeto, Seca, Viaccess, Nagra, Conax & Cryptoworks等CA系统的读卡、共享等操作。
💻 DIFF
字号:
diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/ci.c vdr-1.4.7-sc7/ci.c--- vdr-1.4.7-orig/ci.c	2007-04-30 14:58:41.000000000 +0200+++ vdr-1.4.7-sc7/ci.c	2007-05-13 18:04:04.000000000 +0200@@ -1502,9 +1502,8 @@   close(fd); } -cCiHandler *cCiHandler::CreateCiHandler(const char *FileName)+cCiHandler *cCiHandler::CreateCiHandler(int fd_ca) {-  int fd_ca = open(FileName, O_RDWR);   if (fd_ca >= 0) {      ca_caps_t Caps;      if (ioctl(fd_ca, CA_GET_CAP, &Caps) == 0) {@@ -1520,8 +1519,7 @@            esyslog("ERROR: no CAM slots found");         }      else-        LOG_ERROR_STR(FileName);-     close(fd_ca);+        LOG_ERROR_STR("CA_GET_CAP");      }   return NULL; }diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/ci.h vdr-1.4.7-sc7/ci.h--- vdr-1.4.7-orig/ci.h	2006-08-12 11:43:31.000000000 +0200+++ vdr-1.4.7-sc7/ci.h	2007-06-24 19:46:39.000000000 +0200@@ -85,10 +85,12 @@ class cCiCaProgramData : public cListObject { public:   int programNumber;+  bool modified;   cList<cCiCaPidData> pidList;   cCiCaProgramData(int ProgramNumber)   {     programNumber = ProgramNumber;+    modified = true;   }   }; @@ -96,6 +98,8 @@ class cCiTransportLayer; class cCiTransportConnection; +#define VDR_IS_SC_PATCHED 402+ class cCiHandler { private:   cMutex mutex;@@ -123,7 +127,7 @@   void SendCaPmt(void); public:   ~cCiHandler();-  static cCiHandler *CreateCiHandler(const char *FileName);+  static cCiHandler *CreateCiHandler(int fd_ca);        ///< Creates a new cCiHandler for the given CA device.   int NumSlots(void) { return numSlots; }        ///< Returns the number of CAM slots provided by this CA device.diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/device.c vdr-1.4.7-sc7/device.c--- vdr-1.4.7-orig/device.c	2006-09-03 12:13:25.000000000 +0200+++ vdr-1.4.7-sc7/device.c	2007-05-13 18:30:57.000000000 +0200@@ -395,6 +395,54 @@   return false; } +void cDevice::CiStartDecrypting(void)+{+  if (ciHandler)+     ciHandler->StartDecrypting();+}++void cDevice::CiSetSource(int Source, int Transponder)+{+  cMutexLock MutexLock(&ciListMutex);+  if (ciSource != Source || ciTransponder != Transponder)+     ciProgramList.Clear();+  ciSource = Source;+  ciTransponder = Transponder;+}++void cDevice::CiAddPid(int ProgramNumber, int Pid, int StreamType)+{+  cMutexLock MutexLock(&ciListMutex);+  cCiCaProgramData *ProgramData = NULL;+  for (cCiCaProgramData *p = ciProgramList.First(); p; p = ciProgramList.Next(p)) {+      if (p->programNumber == ProgramNumber) {+         ProgramData = p;+         for (cCiCaPidData *q = p->pidList.First(); q; q = p->pidList.Next(q)) {+             if (q->pid == Pid)+                return;+             }+         }+      }+  if (!ProgramData)+     ciProgramList.Add(ProgramData = new cCiCaProgramData(ProgramNumber));+  ProgramData->pidList.Add(new cCiCaPidData(Pid, StreamType));+  ProgramData->modified=true;+}++void cDevice::CiSetPid(int Pid, bool Active)+{+  cMutexLock MutexLock(&ciListMutex);+  for (cCiCaProgramData *p = ciProgramList.First(); p; p = ciProgramList.Next(p)) {+      for (cCiCaPidData *q = p->pidList.First(); q; q = p->pidList.Next(q)) {+          if (q->pid == Pid) {+             q->active = Active;+             p->modified = true;+             return;+             }+         }+      }+}+ bool cDevice::AddPid(int Pid, ePidType PidType) {   if (Pid || PidType == ptPcr) {@@ -424,6 +472,7 @@               }            if (ciHandler)               ciHandler->SetPid(Pid, true);+           CiSetPid(Pid, true);            }         PRINTPIDS("a");         return true;@@ -453,6 +502,7 @@            }         if (ciHandler)            ciHandler->SetPid(Pid, true);+        CiSetPid(Pid, true);         }      }   return true;@@ -481,6 +531,7 @@               pidHandles[n].pid = 0;               if (ciHandler)                  ciHandler->SetPid(Pid, false);+              CiSetPid(Pid, false);               }            }         PRINTPIDS("E");@@ -663,6 +714,16 @@            } #endif         }++     CiSetSource(Channel->Source(), Channel->Transponder());+     if (Channel->Ca() >= CA_ENCRYPTED_MIN) {+        CiAddPid(Channel->Sid(), Channel->Vpid(), 2);+        for (const int *Apid = Channel->Apids(); *Apid; Apid++)+            CiAddPid(Channel->Sid(), *Apid, 4);+        for (const int *Dpid = Channel->Dpids(); *Dpid; Dpid++)+            CiAddPid(Channel->Sid(), *Dpid, 0);+        }+      if (NeedsDetachReceivers)         DetachAllReceivers();      if (SetChannelDevice(Channel, LiveView)) {@@ -672,8 +733,7 @@            sectionHandler->SetStatus(true);            }         // Start decrypting any PIDs that might have been set in SetChannelDevice():-        if (ciHandler)-           ciHandler->StartDecrypting();+        CiStartDecrypting();         }      else         Result = scrFailed;@@ -1258,8 +1318,7 @@          Unlock();          if (!Running())             Start();-         if (ciHandler)-            ciHandler->StartDecrypting();+         CiStartDecrypting();          return true;          }       }@@ -1286,8 +1345,7 @@       else if (receiver[i])          receiversLeft = true;       }-  if (ciHandler)-     ciHandler->StartDecrypting();+  CiStartDecrypting();   if (!receiversLeft)      Cancel(3); }diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/device.h vdr-1.4.7-sc7/device.h--- vdr-1.4.7-orig/device.h	2006-06-15 11:32:48.000000000 +0200+++ vdr-1.4.7-sc7/device.h	2007-05-13 18:04:04.000000000 +0200@@ -311,6 +311,14 @@  protected:   cCiHandler *ciHandler;+  int ciSource, ciTransponder;+  cList<cCiCaProgramData> ciProgramList;+  cMutex ciListMutex;+  virtual void CiStartDecrypting(void);+  virtual bool CiAllowConcurrent(void) const { return false; }+  void CiSetSource(int Source, int Transponder);+  void CiAddPid(int ProgramNumber, int Pid, int StreamType);+  void CiSetPid(int Pid, bool Active); public:   cCiHandler *CiHandler(void) { return ciHandler; } diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/dvbdevice.c vdr-1.4.7-sc7/dvbdevice.c--- vdr-1.4.7-orig/dvbdevice.c	2007-02-24 12:10:14.000000000 +0100+++ vdr-1.4.7-sc7/dvbdevice.c	2007-06-24 19:42:24.000000000 +0200@@ -419,7 +419,11 @@      dvb_frontend_info feinfo;      if (ioctl(fd_frontend, FE_GET_INFO, &feinfo) >= 0) {         frontendType = feinfo.type;-        ciHandler = cCiHandler::CreateCiHandler(*cDvbName(DEV_DVB_CA, n));+        int fd_ca = DvbOpen(DEV_DVB_CA, n, O_RDWR);+        if(fd_ca>=0) {+          ciHandler = cCiHandler::CreateCiHandler(fd_ca);+          if(!ciHandler) close(fd_ca);+          }         dvbTuner = new cDvbTuner(fd_frontend, CardIndex(), frontendType, ciHandler);         }      else@@ -776,8 +780,12 @@            if (Channel->Vpid() && !HasPid(Channel->Vpid()) || Channel->Apid(0) && !HasPid(Channel->Apid(0))) { #ifdef DO_MULTIPLE_RECORDINGS #ifndef DO_MULTIPLE_CA_CHANNELS-              if (Ca() >= CA_ENCRYPTED_MIN || Channel->Ca() >= CA_ENCRYPTED_MIN)-                 needsDetachReceivers = Ca() != Channel->Ca();+              if (Ca() >= CA_ENCRYPTED_MIN || Channel->Ca() >= CA_ENCRYPTED_MIN) {+                 if(Channel->Ca()<CA_ENCRYPTED_MIN || CiAllowConcurrent())+                   result = true;+                 else+                   needsDetachReceivers = Ca() != Channel->Ca();+                 }               else #endif               if (!IsPrimaryDevice())@@ -927,7 +935,7 @@            SetPid(&pidHandles[ptAudio], ptAudio, true);            if (ciHandler) {               ciHandler->SetPid(pidHandles[ptAudio].pid, true);-              ciHandler->StartDecrypting();+              CiStartDecrypting();               }            }         }diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/tools.c vdr-1.4.7-sc7/tools.c--- vdr-1.4.7-orig/tools.c	2006-12-02 12:12:59.000000000 +0100+++ vdr-1.4.7-sc7/tools.c	2007-05-13 18:04:04.000000000 +0200@@ -542,9 +542,9 @@  // --- cTimeMs --------------------------------------------------------------- -cTimeMs::cTimeMs(void)+cTimeMs::cTimeMs(int Ms) {-  Set();+  Set(Ms); }  uint64_t cTimeMs::Now(void)diff -urN -X ex.vdr-sc7 vdr-1.4.7-orig/tools.h vdr-1.4.7-sc7/tools.h--- vdr-1.4.7-orig/tools.h	2006-12-03 18:38:38.000000000 +0100+++ vdr-1.4.7-sc7/tools.h	2007-05-13 18:04:04.000000000 +0200@@ -162,7 +162,7 @@ private:   uint64_t begin; public:-  cTimeMs(void);+  cTimeMs(int Ms = 0);   static uint64_t Now(void);   void Set(int Ms = 0);   bool TimedOut(void);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -