]> www.vanbest.org Git - sasc-ng.git/commitdiff
cardclient-CCcam: rewrite capmt generator
authorleslie <unknown>
Mon, 9 Jun 2008 07:44:08 +0000 (15:44 +0800)
committerleslie <unknown>
Mon, 9 Jun 2008 07:44:08 +0000 (15:44 +0800)
systems/cardclient/cccam.c

index f37389c1539040f93c13e315895d9a9fe25ce58c..b120bac30934d4696652a6c064e854989b2fd98f 100644 (file)
@@ -228,70 +228,70 @@ bool cCardClientCCcam::ProcessECM(const cEcmInfo *ecm, const unsigned char *data
   //so.Flush();\r
   //  cMutexLock lock(this);\r
   //newcw[cardnum] =0;\r
+\r
+  static const unsigned char pmt[] = {\r
+    0x9f,0x80,0x32,0x82,0x00,0x00,\r
+    0x01,\r
+#define PRG_POS 7\r
+    0xFF,0xFF,                                          // prg-nr\r
+#define VERS_POS 9\r
+    0xFF,                                               // version\r
+#define LEN_POS 10\r
+    0xFF,0xFF,                                          // prg-info-len\r
+    0x01,                                               // ca pmt command\r
+#define PRIV_POS 13\r
+    0x81,0x08,0x00,0x00,0xFF,0x00,0xFF,0xFF,0xFF,0xFF,  // private descr\r
+#define DMX_POS 23\r
+    0x82,0x02,0xFF,0xFF,                                // demuxer stuff\r
+#define PID_POS 27\r
+    0x84,0x02,0xFF,0xFF                                 // pmt pid\r
+    };\r
   unsigned char capmt[2048];\r
-  const int caid=ecm->caId;\r
-  const int pid =ecm->ecm_pid;\r
-  int lenpos=10;\r
-  int len=19;\r
-  int wp=31;\r
+  memcpy(capmt,pmt,sizeof(pmt));\r
+  int wp=sizeof(pmt);\r
+  int len=wp-LEN_POS-2;\r
+  capmt[PRG_POS]=ecm->prgId>>8;\r
+  capmt[PRG_POS+1]=ecm->prgId&0xff;\r
+  capmt[VERS_POS]=pmtversion;\r
+  pmtversion=(pmtversion+1)&0x1f;\r
+  capmt[PRIV_POS+4]=cardnum;\r
+  capmt[PRIV_POS+6]=ecm->transponder>>8;\r
+  capmt[PRIV_POS+7]=ecm->transponder&0xFF;\r
+  capmt[PRIV_POS+8]=ecm->provId>>8;\r
+  capmt[PRIV_POS+9]=ecm->provId&0xFF;\r
+  capmt[DMX_POS+2]=1<<cardnum ;\r
+  capmt[DMX_POS+3]=cardnum ;\r
+  capmt[PID_POS+2]=ecm->ecm_pid>>8;\r
+  capmt[PID_POS+3]=ecm->ecm_pid&0xFF;\r
+  bool streamflag = 1;\r
+#if APIVERSNUM >= 10500\r
   int casys[2];\r
-  casys[0]=caid;\r
+#else\r
+  unsigned short casys[2];\r
+#endif\r
+  casys[0]=ecm->caId;\r
   casys[1]=0;\r
-\r
-  //PRINTF(L_CC_CCCAM,"Card num beign used... - %d, pid %d progid %d provid %d caid %d",cardnum, pid,ecm->prgId, ecm->provId, ecm->caId );\r
-  memcpy(capmt,"\x9f\x80\x32\x82\x00\x00", 6);\r
-  capmt[6]=0x01; //prg-nr\r
-  capmt[7]=(unsigned char)((ecm->prgId>>8) & 0xff); //prg-nr\r
-  capmt[8]=(unsigned char)(ecm->prgId & 0xff);\r
-  capmt[9]=pmtversion;     //reserved - version - current/next\r
-  pmtversion++;\r
-  pmtversion%=32; //0x00;  reserved - prg-info len\r
-  capmt[10]=(unsigned char)((ecm->prgId>>8) & 0xff); //0x00;  prg-info len\r
-  capmt[11]=(unsigned char)(ecm->prgId & 0xff);\r
-  // this is ASN.1 this is NOT the way you do BER...\r
-  capmt[12]=0x01;        //CMD_OK_DESCRAMBLING;   ca pmt command id\r
-  capmt[13]=0x81;        // private descr.. dvbnamespace\r
-  capmt[14]=0x08;\r
-  {\r
-  int dvb_namespace = cardnum<<8;\r
-  capmt[15]=dvb_namespace>>24;\r
-  capmt[16]=(dvb_namespace>>16)&0xFF;\r
-  capmt[17]=(dvb_namespace>>8)&0xFF;\r
-  capmt[18]=dvb_namespace&0xFF;\r
-  }\r
-  capmt[19]=ecm->transponder>>8;\r
-  capmt[20]=ecm->transponder&0xFF;\r
-  capmt[21]=ecm->provId>>8;\r
-  capmt[22]=ecm->provId&0xFF;\r
-  capmt[23]=0x82;        // demuxer kram..\r
-  capmt[24]=0x02;\r
-  capmt[25]= 1<<cardnum ;\r
-  capmt[26]= cardnum ;\r
-  capmt[27]=0x84;        // pmt pid\r
-  capmt[28]=0x02;\r
-  capmt[29]=pid>>8;\r
-  capmt[30]=pid&0xFF;\r
-  bool streamflag = 1;\r
-  int n=GetCaDescriptors(ecm->source,ecm->transponder,ecm->prgId,casys,sizeof(capmt)-31,&capmt[31],streamflag);\r
-  len+=n;\r
-  wp+=n;\r
-  capmt[wp++] = 0x01;\r
-  capmt[wp++] = 0x0f;\r
-                 // cccam uses this one as PID to program ca0..\r
-  capmt[wp++] = cardnum&0xFF;\r
-  capmt[wp++] = 0x00;      //es_length\r
-  capmt[wp++] = 0x06;      //es ca_pmt_cmd_id\r
-  capmt[lenpos]=((len & 0xf00)>>8);\r
-  capmt[lenpos+1]=(len & 0xff);\r
-  capmt[4]=((wp-6)>>8) & 0xff;\r
-  capmt[5]=(wp-6) & 0xff;\r
+  int n=GetCaDescriptors(ecm->source,ecm->transponder,ecm->prgId,casys,sizeof(capmt)-wp,&capmt[wp],streamflag);\r
+  if(n<=0) {\r
+    PRINTF(L_CC_CCCAM,"no CA descriptor for caid %04x sid %d prov %04x",ecm->caId,ecm->prgId,ecm->provId);\r
+    return false;\r
+    }\r
+  len+=n; wp+=n;\r
+  capmt[wp++]=0x01;\r
+  capmt[wp++]=0x0f;\r
+  capmt[wp++]=cardnum;   // cccam uses this one as PID to program ca0\r
+  capmt[wp++]=0x00;      //es_length\r
+  capmt[wp++]=0x06;      //es ca_pmt_cmd_id\r
+  capmt[LEN_POS]=((len&0xf00)>>8);\r
+  capmt[LEN_POS+1]=(len&0xff);\r
+  capmt[4]=(wp-6)>>8;\r
+  capmt[5]=(wp-6)&0xff;\r
 \r
   cCCcamCard *c=&card[cardnum];\r
-\r
   int timeout=700;\r
-  if(pid!=c->Pid() || !c->Connected()) { // channel change\r
+  if(ecm->ecm_pid!=c->Pid() || !c->Connected()) { // channel change\r
     PRINTF(L_CC_CCCAM,"sending capmts ");\r
-    c->NewCaPmt(pid,capmt,wp);\r
+    c->NewCaPmt(ecm->ecm_pid,capmt,wp);\r
     timeout=3000;\r
     }\r
   if(!c->GetCw(cw,timeout)) {\r