//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