]> www.vanbest.org Git - sasc-ng.git/commitdiff
fix vdr 1.4.7 operation
authorleslie <unknown>
Mon, 27 Jul 2009 07:20:33 +0000 (15:20 +0800)
committerleslie <unknown>
Mon, 27 Jul 2009 07:20:33 +0000 (15:20 +0800)
cam.c
cam.h
sc.c

diff --git a/cam.c b/cam.c
index 76eb6d00d7458dbd344b3abef152caa9c671394d..5907de20fb60585656bbb74a693a5f904c62a070 100644 (file)
--- a/cam.c
+++ b/cam.c
@@ -2731,6 +2731,8 @@ cScDvbDevice::cScDvbDevice(int n, int cafd)
   decsa=0; tsBuffer=0; cam=0; fullts=false;
 #if APIVERSNUM >= 10500
   ciadapter=0; hwciadapter=0;
+#else
+  memset(lrucaid,0,sizeof(lrucaid));
 #endif
   fd_ca=cafd; fd_ca2=dup(fd_ca); fd_dvr=-1;
   softcsa=(fd_ca<0);
@@ -2914,6 +2916,17 @@ bool cScDvbDevice::SetPid(cPidHandle *Handle, int Type, bool On)
 
 bool cScDvbDevice::SetChannelDevice(const cChannel *Channel, bool LiveView)
 {
+#if APIVERSNUM < 10500
+  lruMutex.Lock();
+  int i=FindLRUPrg(Channel->Source(),Channel->Transponder(),Channel->Sid());
+  if(i<0) i=MAX_LRU_CAID-1;
+  if(i>0) memmove(&lrucaid[1],&lrucaid[0],sizeof(struct LruCaid)*i);
+  for(i=0; i<=MAXCAIDS; i++) if((lrucaid[0].caids[i]=Channel->Ca(i))==0) break;
+  lrucaid[0].src=Channel->Source();
+  lrucaid[0].tr=Channel->Transponder();
+  lrucaid[0].prg=Channel->Sid();
+  lruMutex.Unlock();
+#endif
   if(cam) cam->Tune(Channel);
   bool ret=cDvbDevice::SetChannelDevice(Channel,LiveView);
   if(ret && cam) cam->PostTune();
@@ -2937,6 +2950,25 @@ bool cScDvbDevice::CiAllowConcurrent(void) const
   return softcsa || ScSetup.ConcurrentFF>0;
 }
 
+bool cScDvbDevice::GetPrgCaids(int source, int transponder, int prg, caid_t *c)
+{
+  cMutexLock lock(&lruMutex);
+  int i=FindLRUPrg(source,transponder,prg);
+  if(i>=0) {
+    for(int j=0; j<MAXCAIDS && lrucaid[i].caids[j]; j++) *c++=lrucaid[i].caids[j];
+    *c=0;
+    return true;
+    }
+  return false;
+}
+
+int cScDvbDevice::FindLRUPrg(int source, int transponder, int prg)
+{
+  for(int i=0; i<MAX_LRU_CAID; i++)
+    if(lrucaid[i].src==source && lrucaid[i].tr==transponder && lrucaid[i].prg==prg) return i;
+  return -1;
+}
+
 void cScDvbDevice::CiStartDecrypting(void)
 {
   if(cam) {
@@ -2945,9 +2977,21 @@ void cScDvbDevice::CiStartDecrypting(void)
       if(p->modified) {
         cPrg *prg=new cPrg(p->programNumber,cam->HasPrg(p->programNumber));
         if(prg) {
+          bool haspid=false;
           for(cCiCaPidData *q=p->pidList.First(); q; q=p->pidList.Next(q)) {
-            if(q->active)
+            if(q->active) {
               prg->pids.Add(new cPrgPid(q->streamType,q->pid));
+              haspid=true;
+              }
+            }
+          if(haspid) {
+            caid_t casys[MAXCAIDS+1];
+            if(GetPrgCaids(ciSource,ciTransponder,p->programNumber,casys)) {
+              unsigned char buff[2048];
+              bool streamflag;
+              int len=GetCaDescriptors(ciSource,ciTransponder,p->programNumber,casys,sizeof(buff),buff,streamflag);
+              if(len>0) prg->caDescr.Set(buff,len);
+              }
             }
           prgList.Add(prg);
           }
diff --git a/cam.h b/cam.h
index ed828e367e4a6972c84a40eec36b486f2e8b7c12..df2f5c94506774d17bb3cae7bcf01b4b3c9d6fc2 100644 (file)
--- a/cam.h
+++ b/cam.h
@@ -90,7 +90,7 @@ public:
 
 // ----------------------------------------------------------------
 
-class cPrg {
+class cPrg : public cSimpleItem {
 private:
   bool isUpdate, pidCaDescr;
   //
@@ -187,6 +187,18 @@ private:
   void EarlyShutdown(void);
   bool ScActive(void);
 #endif //SASC
+  //
+#if APIVERSNUM < 10500
+#define MAX_LRU_CAID 10
+  struct LruCaid {
+    int src, tr, prg;
+    caid_t caids[MAXCAIDS+1];
+    } lrucaid[MAX_LRU_CAID];
+  cMutex lruMutex;
+  //
+  int FindLRUPrg(int source, int transponder, int prg);
+  bool GetPrgCaids(int source, int transponder, int prg, caid_t *c);
+#endif
 protected:
 #ifndef SASC
 #if APIVERSNUM >= 10500
diff --git a/sc.c b/sc.c
index 0c3f7dd33216c85c82194c2aa963f94c51631117..fc74767875a4c7669215838b71e9f2b4dc5883de 100644 (file)
--- a/sc.c
+++ b/sc.c
@@ -19,6 +19,7 @@
 
 #include <malloc.h>
 #include <stdlib.h>
+#include <limits.h>
 #include <getopt.h>
 #include <typeinfo>
 #ifndef STATICBUILD