]> www.vanbest.org Git - sasc-ng.git/commitdiff
add ECM priorities to override.conf
authorleslie <unknown>
Sun, 20 Sep 2009 01:28:41 +0000 (09:28 +0800)
committerleslie <unknown>
Sun, 20 Sep 2009 01:28:41 +0000 (09:28 +0800)
cam.c
examples/override.conf.example
override.c
override.h

diff --git a/cam.c b/cam.c
index 3a91321229b07e59fa2efc26f5d1442656b19efb..7b31b6e71a65663aa748e93bcebc44bb1bb29308 100644 (file)
--- a/cam.c
+++ b/cam.c
@@ -1313,6 +1313,7 @@ void cEcmHandler::AddEcmPri(cEcmInfo *n)
       ep->pri=pri;
       ep->sysIdent=ident;
       if(n->Cached() && (!ScSetup.LocalPriority || pri!=-15)) ep->pri+=20;
+      ep->pri=ep->pri*100 + overrides.GetEcmPrio(n->source,n->transponder,n->caId,n->provId);
 
       // keep ecmPriList sorted
       cEcmPri *eppp, *epp=ecmPriList.First();
index 73ea030037288b4e10baaa50a8eea86f07394006..82f9b53a0b94eef431ec27f91ce6da415e153ba7 100644 (file)
 ; ignore:{S61.5W-S148W:}1801:0D04:0600
 ; ignore:{*}0622:1833
 
+;
+; Define priority chains for ECM processing
+;
+; The first listed CAID will have the highest priority, then stepping down. If a
+; CAID is not listed, the priority will be lower than the last one.
+;
+; NOTE: priorities based on provider ID are supported for CAID 0100 & 0500 only,
+; and are rejected for others.
+;
+; format:
+; ecmprio:{src[-src]:[freq[-freq]]}caid[/provid][:caid[/provid]][...]
+;
+; examples
+; ecmprio:{S19.2E}0100/6a:0622
+; ecmprio:{S28.5E:12973}1833:1702:1801
+
 ;
 ; Add entries to the CAT (conditional access table) in case a EMM stream is
 ; not announced there.
index ced1cd4a0c7711943b7eb8e43ed1e255082aa73c..f7f292f2a75dc950e08315dfcaec7808a90fdc30 100644 (file)
@@ -178,6 +178,7 @@ cString cValidityRange::Print(void)
 #define OV_EMMTABLE 4
 #define OV_TUNNEL   5
 #define OV_IGNORE   6
+#define OV_ECMPRIO  7
 
 // -- cOverrideCat -------------------------------------------------------------
 
@@ -484,6 +485,68 @@ bool cOverrideIgnore::Ignore(int Caid)
   return false;
 }
 
+// -- cOverrideEcmPrio ---------------------------------------------------------
+
+#define OV_MAXPRIOS 16
+
+class cOverrideEcmPrio : public cOverride {
+private:
+  int num, caid[OV_MAXPRIOS], prov[OV_MAXPRIOS];
+  //
+  bool UsesProvId(int caid);
+public:
+  cOverrideEcmPrio(void) { type=OV_ECMPRIO; }
+  virtual bool Parse(char *str);
+  int GetPrio(int Caid, int Prov);
+  };
+
+bool cOverrideEcmPrio::Parse(char *str)
+{
+  if((str=Parse2(str))) {
+    num=0;
+    int n=-1;
+    do {
+      prov[num]=-1;
+      int l=n+1;
+      if(sscanf(&str[l],"%x%n/%x%n",&caid[num],&n,&prov[num],&n)<1) {
+        PRINTF(L_CORE_LOAD,"override: ECMPRIO format error");
+        return false;
+        }
+      if(prov[num]>=0 && !UsesProvId(caid[num])) {
+        PRINTF(L_CORE_LOAD,"override: ECMPRIO provider ID not supported for caid %04x",caid[num]);
+        return false;
+        }
+      n+=l; num++;
+      } while(num<OV_MAXPRIOS && str[n]==':');
+    LBSTART(L_CORE_OVER);
+    LBPUT("ecmprio: %s - chain",*Print());
+    for(int i=0; i<num; i++) LBPUT(prov[i]>=0 ? " %04x/%x":" %04x",caid[i],prov[i]);
+    LBEND();
+    return true;
+    }
+  return false;
+}
+
+bool cOverrideEcmPrio::UsesProvId(int caid)
+{
+  switch(caid>>8) {
+    case 0x01:
+    case 0x05: return true;
+    }
+  return false;
+}
+
+int cOverrideEcmPrio::GetPrio(int Caid, int Prov)
+{
+  int pri=0;
+  for(int i=0; i<num; i++) {
+    if(Caid==caid[i] && (prov[i]<0 || Prov==prov[i])) break;
+    pri--;
+    }
+  PRINTF(L_CORE_OVER,"ecmprio: %04x/%x pri %d",Caid,Prov,pri);
+  return pri;
+}
+
 // -- cOverrides ---------------------------------------------------------------
 
 cOverrides overrides;
@@ -505,6 +568,7 @@ cOverride *cOverrides::ParseLine(char *line)
     else if(!strncasecmp(line,"emmtable",8)) ov=new cOverrideEmmTable;
     else if(!strncasecmp(line,"tunnel",6)) ov=new cOverrideTunnel;
     else if(!strncasecmp(line,"ignore",6)) ov=new cOverrideIgnore;
+    else if(!strncasecmp(line,"ecmprio",7)) ov=new cOverrideEcmPrio;
     if(ov && !ov->Parse(p)) { delete ov; ov=0; }
     }
   return ov;
@@ -570,3 +634,13 @@ bool cOverrides::Ignore(int source, int transponder, int caid)
   ListUnlock();
   return res;
 }
+
+int cOverrides::GetEcmPrio(int source, int transponder, int caid, int prov)
+{
+  int pri=0;
+  ListLock(false);
+  cOverrideEcmPrio *ovp=dynamic_cast<cOverrideEcmPrio *>(Find(OV_ECMPRIO,-1,source,transponder));
+  if(ovp) pri=ovp->GetPrio(caid,prov);
+  ListUnlock();
+  return pri;
+}
index 42b8216c9437ba5ed9278e712f835f52e4a4f9af..316f9cb12c337142d6cfa44ad3f4d07d938c757e 100644 (file)
@@ -92,6 +92,7 @@ public:
   void UpdateEcm(cEcmInfo *ecm, bool log);
   bool AddEmmPids(int caid, int source, int transponder, cPids *pids, int pid);
   bool Ignore(int source, int transponder, int caid);
+  int GetEcmPrio(int source, int transponder, int caid, int prov);
   };
 
 extern cOverrides overrides;