Changeset 1055
- Timestamp:
- 01/03/10 22:37:52 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/smartreader/module-dvbapi.c
r1038 r1055 40 40 #define CAMDSOCKET "/tmp/camd.socket" 41 41 42 #define BUFSIZE 42 #define BUFSIZE 1024 43 43 #define MAX_CAID 50 44 44 #define MAX_DEMUX 3 45 45 46 47 46 static int listenfd = -1; 48 49 47 50 48 typedef struct ECMPIDS … … 52 50 int CA_PID; 53 51 int CA_System_ID; 52 int EMM_PID; 54 53 } ECMPIDSTYPE; 55 54 … … 66 65 int ca_system_id; 67 66 int ca_pid; 67 int provider_id; 68 int received_emm; 69 int STREAMpidcount; 70 short STREAMpids[20]; 68 71 unsigned char buffer_cache_dmx[12]; 69 72 unsigned char lastcw0[8]; … … 79 82 DEMUXTYPE demux[MAX_DEMUX]; 80 83 81 82 int dvbapi_open_demux(int index_demux) 84 int dvbapi_read_device(int dmx_fd, unsigned char *buf, int length, int debug) 85 { 86 int len; 87 len=read(dmx_fd, buf, length); 88 89 if (len==-1) 90 cs_log("error %d", errno); 91 92 if (debug==1) 93 cs_debug("Read %d bytes from demux", len); 94 95 return len; 96 } 97 98 int dvbapi_open_device(int index_demux, int type) 83 99 { 84 100 int dmx_fd; 85 101 char device_path[256]; 86 87 sprintf(device_path, DMXDEV, index_demux); 102 103 if (type==0) 104 sprintf(device_path, DMXDEV, index_demux); 105 else 106 sprintf(device_path, CADEV, demux[index_demux].cadev_index); 88 107 89 108 if ((dmx_fd = open(device_path, O_RDWR)) < 0) 90 cs_log("error opening de mux%s", device_path);91 92 cs_debug(" DEMUX open: %s", device_path);109 cs_log("error opening device %s", device_path); 110 111 cs_debug("dvbapi: DEVICE open (%s)", device_path); 93 112 return dmx_fd; 94 113 } 95 114 96 97 int dvbapi_open_ca(int index_demux) 98 { 99 int ca_fd,i; 100 char device_path[256]; 101 102 sprintf(device_path, CADEV, demux[index_demux].cadev_index); 103 104 if ((ca_fd = open(device_path, O_RDWR)) < 0) { 105 cs_log("error opening ca %s", device_path); 115 int dvbapi_set_filter(int demux_index, int type, int pid, unsigned char filt, unsigned char mask, int timeout) 116 { 117 struct dmx_sct_filter_params sFP; 118 int dmx_fd; 119 120 cs_debug("dvbapi: set filter pid:%04x, value:%04x",pid, filt); 121 122 memset(&sFP,0,sizeof(sFP)); 123 124 sFP.pid = pid; 125 sFP.timeout = timeout; 126 sFP.flags = DMX_IMMEDIATE_START; 127 sFP.filter.filter[0] = filt; 128 sFP.filter.mask[0] = mask; 129 130 if (type==0) 131 dmx_fd=demux[demux_index].demux_ecm_fd; 132 else 133 dmx_fd=demux[demux_index].demux_emm_fd; 134 135 if (ioctl(dmx_fd, DMX_SET_FILTER, &sFP) < 0) 136 { 137 cs_log("dvbapi: could not start demux filter"); 106 138 return 0; 107 139 } 108 140 109 demux[index_demux].ca_fd=ca_fd; 110 111 cs_debug("CA open: %s", device_path); 112 return ca_fd; 113 } 114 115 unsigned short dvbapi_get_single_ecm(int demux_index, int caid, int pid, unsigned char filt, unsigned char mask) 141 ioctl(dmx_fd, DMX_START); 142 143 return dmx_fd; 144 } 145 146 int dvbapi_stop_filter(int demux_index, int type) 147 { 148 int dmx_fd; 149 150 if (type==0) { 151 dmx_fd=demux[demux_index].demux_ecm_fd; 152 } else { 153 dmx_fd=demux[demux_index].demux_emm_fd; 154 } 155 156 ioctl(dmx_fd,DMX_STOP); 157 return 1; 158 } 159 160 unsigned short dvbapi_get_provid(int demux_index, int pid) 116 161 { 117 162 unsigned char buf[BUFSIZE]; 118 163 int dmx_fd, len; 119 164 120 struct dmx_sct_filter_params sFP; 121 122 memset(&sFP, 0, sizeof(sFP)); 123 memset(buf,0,BUFSIZE); 124 125 sFP.pid = pid; 126 sFP.timeout = 2000; 127 sFP.flags = DMX_ONESHOT | DMX_CHECK_CRC | DMX_IMMEDIATE_START; 128 sFP.filter.filter[0] = filt; 129 sFP.filter.mask[0] = mask; 130 131 cs_debug("dvbapi: filter for 1 ECM"); 132 133 dmx_fd = dvbapi_open_demux(demux_index); 134 135 if (ioctl(dmx_fd, DMX_SET_FILTER, &sFP) < 0) 136 return 0; 137 138 len=read(dmx_fd, buf, BUFSIZE); 139 cs_debug("Read %d bytes from demux", len); 140 141 close(dmx_fd); 165 dmx_fd=dvbapi_set_filter(demux_index, 1, pid, 0x80, 0xF0, 8000); 166 167 len=dvbapi_read_device(dmx_fd, buf, BUFSIZE, 1); 168 169 if (len > 0) { 170 short int provid = (buf[10] << 8) | buf[11]; 171 return provid; 172 } 173 174 return 0; 175 } 176 177 unsigned short dvbapi_get_single_ecm(int demux_index, int caid, int pid, unsigned short provid) 178 { 179 unsigned char buf[BUFSIZE]; 180 int dmx_fd, len; 181 182 dmx_fd=dvbapi_set_filter(demux_index, 0, pid, 0x80, 0xF0, 2000); 183 184 len=dvbapi_read_device(dmx_fd, buf, BUFSIZE, 1); 142 185 143 186 if (len > 0) { … … 146 189 if (!(er=get_ecmtask())) 147 190 return 0; 148 191 149 192 er->srvid = demux[demux_index].program_number; 150 193 er->caid = caid; 151 194 er->pid = pid; 152 //er->prid = 0x3411;195 //er->prid = provid; 153 196 154 197 er->l=len; … … 160 203 } 161 204 162 unsigned shortdvbapi_parse_cat(int demux_index)205 void dvbapi_parse_cat(int demux_index) 163 206 { 164 207 unsigned char buf[BUFSIZE]; 165 unsigned short i, emmpid;208 unsigned short i, j; 166 209 int dmx_fd, len; 167 168 unsigned short ca_system_id=demux[demux_index].ca_system_id; 169 170 struct dmx_sct_filter_params sFP; 171 172 memset(&sFP, 0, sizeof(sFP)); 173 174 memset(buf,0,BUFSIZE); 175 176 sFP.filter.filter[0] = 0x01; 177 sFP.filter.mask[0] = 0xFF; 178 sFP.flags = DMX_ONESHOT | DMX_CHECK_CRC | DMX_IMMEDIATE_START; 179 sFP.pid = 0x0001; 180 sFP.timeout = 3000; //3secs 181 182 183 dmx_fd = dvbapi_open_demux(demux_index); 184 185 if (ioctl(dmx_fd, DMX_SET_FILTER, &sFP) < 0) 186 return 0; 187 188 len=read(dmx_fd, buf, BUFSIZE); 189 190 191 cs_debug("Read %d bytes from demux", len); 192 193 close(dmx_fd); 210 //unsigned short ca_system_id=demux[demux_index].ca_system_id; 211 212 dmx_fd=dvbapi_set_filter(demux_index, 0, 0x0001, 0x01, 0xFF, 2000); 213 214 len=dvbapi_read_device(dmx_fd, buf, BUFSIZE, 1); 194 215 195 216 if (len<=0) 196 return 0; 217 return; 218 219 cs_ddump(buf, len, "cat:"); 197 220 198 221 for (i = 8; i < (((buf[1] & 0x0F) << 8) | buf[2]) - 1; i += buf[i + 1] + 2) 199 222 { 200 if ((buf[i] == 0x09) && ((((buf[i + 2] & 0x1F) << 8) | buf[i + 3]) == ca_system_id)) 201 { 202 emmpid=(((buf[i + 4] & 0x1F) << 8) | buf[i + 5]); 203 return emmpid; 204 } 205 } 206 207 return 0; 208 } 209 210 unsigned short dvbapi_parse_ecm(int demux_index, unsigned char *buf, int len) 211 { 212 unsigned short provid; 213 214 provid=(buf[3]<<8)|buf[4]; 215 cs_debug("Read %d bytes\tTable-id: %02x\tCA section length: %d\tProvider ID: %04x", len, buf[0], len ,provid); 216 217 if (len>0) { 218 ECM_REQUEST *er; 219 220 if (!(er=get_ecmtask())) 221 return 0; 222 223 er->srvid = demux[demux_index].program_number; 224 er->caid = demux[demux_index].ca_system_id; 225 //er->prid = 0x3411; 226 227 er->l=len; 228 memcpy(er->ecm, buf, er->l); 229 230 get_cw(er); 231 } 232 233 return(provid); 234 } 235 236 int dvbapi_set_filter(int demux_index, int type, int pid, unsigned char filt, unsigned char mask) 237 { 238 struct dmx_sct_filter_params sFP; 239 cs_debug("Set filter pid:%d, value:%d...",pid, filt); 240 241 memset(&sFP,0,sizeof(sFP)); 242 243 sFP.pid = pid; 244 sFP.timeout = 3000; //wait max 3 seconds for ECM message, should be repeated every 500ms 245 sFP.flags = DMX_CHECK_CRC | DMX_IMMEDIATE_START; 246 sFP.filter.filter[0] = filt; 247 sFP.filter.mask[0] = mask; 248 249 int dmx_fd = dvbapi_open_demux(demux_index); 250 251 if (ioctl(dmx_fd, DMX_SET_FILTER, &sFP) < 0) 252 { 253 perror(" Status"); 254 return 0; 255 } 256 257 if (type==0) 258 demux[demux_index].demux_ecm_fd=dmx_fd; 259 260 if (type==1) 261 demux[demux_index].demux_emm_fd=dmx_fd; 262 263 return 1; 264 } 265 266 void dvbapi_stop_descramble(int demux_index) 223 if (buf[i] != 0x09) continue; 224 unsigned short cat_sys_id=(((buf[i + 2] & 0x1F) << 8) | buf[i + 3]); 225 unsigned short emm_pid=(((buf[i + 4] & 0x1F) << 8) | buf[i + 5]); 226 cs_debug("cat: ca_system_id: %04x\temm_pid %04x", cat_sys_id, emm_pid); 227 for (j=0;j<demux[demux_index].ECMpidcount;j++) { 228 if (demux[demux_index].ECMpids[j].CA_System_ID==(((buf[i + 2] & 0x1F) << 8) | buf[i + 3])) { 229 demux[demux_index].ECMpids[j].EMM_PID=emm_pid; 230 break; 231 } 232 } 233 } 234 235 return; 236 } 237 238 void dvbapi_stop_descramble(int demux_index) 267 239 { 268 240 269 241 /* 270 242 if (global_capid != 0) { 243 271 244 // unset pid?? (not working) 245 272 246 ca_pid_t ca_pid; 273 247 memset(&ca_pid,0,sizeof(ca_pid)); … … 279 253 280 254 cs_log("dvbapi: Stop descrambling CAID: %04x", demux[demux_index].ca_system_id); 281 255 282 256 demux[demux_index].ca_system_id=0; 283 257 demux[demux_index].ca_pid=0; 284 258 demux[demux_index].emm_pid=0; 285 259 demux[demux_index].provider_id=0; 286 260 287 261 if (demux[demux_index].demux_ecm_fd>0) { 288 ioctl(demux[demux_index].demux_ecm_fd,DMX_STOP); 262 ioctl(demux[demux_index].demux_ecm_fd,DMX_STOP); 289 263 close(demux[demux_index].demux_ecm_fd); 290 264 cs_debug("closing ecm dmx device"); … … 308 282 } 309 283 310 void dvbapi_start_descramble(int demux_index, int caid, int capid) { 284 void dvbapi_start_descramble(int demux_index, int caid, int capid, unsigned short provider_id) 285 { 286 int i; 311 287 312 288 cs_log("dvbapi: Start descrambling CAID: %04x", caid); … … 314 290 demux[demux_index].ca_pid=capid; 315 291 demux[demux_index].ca_system_id=caid; 316 317 if (!dvbapi_set_filter(demux_index,0,capid,0x80,0xF0)) //filter on ECM pid and 0x80 or 0x81 (mask 0xF0) 318 cs_log("Error ECM filtering"); 319 320 /* 321 * get emm pid and start filter 322 * TODO: prase_cat blocks thread */ 323 324 if (cfg->dvbapi_au==1) { 325 short emmpid; 326 emmpid=dvbapi_parse_cat(demux_index); 327 328 cs_log("EMMPid: %04x", emmpid); 329 demux[demux_index].emm_pid=emmpid; 330 dvbapi_set_filter(demux_index,1,emmpid,0x80,0xF0); 331 } 332 333 int camfd=dvbapi_open_ca(demux_index); 292 demux[demux_index].provider_id=provider_id; 293 294 295 int camfd=dvbapi_open_device(demux_index,1); 334 296 if (camfd<=0) { 335 297 dvbapi_stop_descramble(demux_index); … … 339 301 demux[demux_index].ca_fd=camfd; 340 302 303 /* 341 304 ca_pid_t ca_pid; 342 305 memset(&ca_pid,0,sizeof(ca_pid)); 343 306 ca_pid.pid = capid; 344 ca_pid.index = 0;307 ca_pid.index = demux_index; 345 308 if (ioctl(camfd, CA_SET_PID, &ca_pid)==-1) 346 cs_log("dvbapi: Error SET_PID"); 309 cs_debug("dvbapi: Error CAPID SET_PID"); 310 */ 311 312 for (i=0;i<demux[demux_index].STREAMpidcount;i++) 313 { 314 315 ca_pid_t ca_pid2; 316 memset(&ca_pid2,0,sizeof(ca_pid2)); 317 ca_pid2.pid = demux[demux_index].STREAMpids[i]; 318 ca_pid2.index = -1; 319 if (ioctl(camfd, CA_SET_PID, &ca_pid2)==-1) 320 cs_debug("dvbapi: Error Stream SET_PID"); 321 322 memset(&ca_pid2,0,sizeof(ca_pid2)); 323 ca_pid2.pid = demux[demux_index].STREAMpids[i]; 324 ca_pid2.index = demux_index; 325 if (ioctl(camfd, CA_SET_PID, &ca_pid2)==-1) 326 cs_debug("dvbapi: Error Stream SET_PID"); 327 } 328 347 329 } 348 330 349 331 // from tuxbox camd 332 350 333 int dvbapi_parse_capmt(unsigned char *buffer, unsigned int length) 351 334 { 352 335 unsigned short i, j; 353 int n, added, ca_mask , demux_index;336 int n, added, ca_mask=1, demux_index=0; 354 337 355 338 int ca_pmt_list_management = buffer[0]; … … 360 343 { 361 344 case 0x01: 345 362 346 //FIXME?? (first) 347 363 348 break; 364 349 case 0x03: 350 365 351 //default (only) 352 366 353 break; 367 354 default: 355 368 356 //FIXME?? (unknown) 357 369 358 break; 370 359 } … … 374 363 demux_index = buffer[20]; 375 364 } 376 365 377 366 if (demux[demux_index].program_number==((buffer[1] << 8) | buffer[2])) 378 367 return 0; … … 387 376 demux[demux_index].cadev_index=ca_mask; 388 377 389 //CA_PIDS fr alle Streams 378 //CA_PIDS for all streams 379 390 380 if (program_info_length != 0) 391 381 { 392 int ca_pmt_cmd_id = buffer[6];382 //int ca_pmt_cmd_id = buffer[6]; 393 383 //cs_debug("ca_pmt_id: %02x", ca_pmt_cmd_id); 394 384 int descriptor_length=0; … … 404 394 demux[demux_index].ECMpids[demux[demux_index].ECMpidcount].CA_PID=ca_pid; 405 395 demux[demux_index].ECMpids[demux[demux_index].ECMpidcount].CA_System_ID=ca_system_id; 396 demux[demux_index].ECMpids[demux[demux_index].ECMpidcount].EMM_PID=0; 406 397 demux[demux_index].ECMpidcount++; 407 398 } … … 415 406 } 416 407 417 418 //CA_PIDs fr einzelne Streams 408 demux[demux_index].STREAMpidcount=0; 409 410 //CA_PIDs for a single stream 411 419 412 unsigned short es_info_length=0; 420 413 for (i = program_info_length + 6; i < length; i += es_info_length + 5) … … 426 419 cs_debug("stream_type: %02x\telementary_pid: %04x\tes_info_length: %04x", stream_type, elementary_pid, es_info_length); 427 420 421 demux[demux_index].STREAMpids[demux[demux_index].STREAMpidcount]=elementary_pid; 422 demux[demux_index].STREAMpidcount++; 423 428 424 if (es_info_length != 0) 429 425 { 430 int ca_pmt_cmd_id = buffer[i + 5];426 //int ca_pmt_cmd_id = buffer[i + 5]; 431 427 int descriptor_length=0; 432 428 for (j = 0; j < es_info_length - 1; j += descriptor_length + 2) … … 447 443 demux[demux_index].ECMpids[demux[demux_index].ECMpidcount].CA_PID=descriptor_ca_pid; 448 444 demux[demux_index].ECMpids[demux[demux_index].ECMpidcount].CA_System_ID=descriptor_ca_system_id; 445 demux[demux_index].ECMpids[demux[demux_index].ECMpidcount].EMM_PID=0; 449 446 demux[demux_index].ECMpidcount++; 450 447 } … … 456 453 dvbapi_stop_descramble(demux_index); 457 454 455 int dmx1_fd,dmx2_fd; 456 457 if (demux[demux_index].ECMpidcount>0) { 458 dmx1_fd = dvbapi_open_device(demux_index,0); //ECM,CAT 459 dmx2_fd = dvbapi_open_device(demux_index,0); //EMM 460 461 demux[demux_index].demux_ecm_fd=dmx1_fd; 462 demux[demux_index].demux_emm_fd=dmx2_fd; 463 464 dvbapi_parse_cat(demux_index); 465 } 466 458 467 cs_log("dvbapi: Found %d ECMpids in PMT", demux[demux_index].ECMpidcount); 468 cs_debug("dvbapi: Found %d STREAMpids in PMT", demux[demux_index].STREAMpidcount); 459 469 460 470 for (n=0; n<demux[demux_index].ECMpidcount; n++) { 461 462 cs_debug("dvbapi: trying CA_System_ID: %04x CA_PID: %04x", demux[demux_index].ECMpids[n].CA_System_ID, demux[demux_index].ECMpids[n].CA_PID);463 471 464 472 if (demux[demux_index].ca_system_id!=0) 465 473 continue; 466 474 467 dvbapi_get_single_ecm(demux_index, demux[demux_index].ECMpids[n].CA_System_ID,demux[demux_index].ECMpids[n].CA_PID,0x80,0xF0); 468 sleep(3); 475 dvbapi_stop_filter(demux_index,0); 476 dvbapi_stop_filter(demux_index,1); 477 478 cs_debug("dvbapi: trying CA_System_ID: %04x CA_PID: %04x EEM_PID: %04x", demux[demux_index].ECMpids[n].CA_System_ID, demux[demux_index].ECMpids[n].CA_PID, demux[demux_index].ECMpids[n].EMM_PID); 479 480 //grep emm provid 481 482 unsigned short provid=0; 483 //if (demux[demux_index].ECMpids[n].EMM_PID>0) 484 // provid=dvbapi_get_provid(demux_index, demux[demux_index].ECMpids[n].EMM_PID); 485 486 //cs_log("Provider ID: %04x", provid); 487 488 //grep ecm 489 490 dvbapi_get_single_ecm(demux_index, demux[demux_index].ECMpids[n].CA_System_ID,demux[demux_index].ECMpids[n].CA_PID, provid); 491 492 493 sleep(3); //try next if no cw for .. secs 469 494 } 470 495 … … 480 505 481 506 if (buffer[0] != 0x9F) { 482 cs_log(" handlesockmsg()unknown socket command: %02x", buffer[0]);507 cs_log("dvbapi: unknown socket command: %02x", buffer[0]); 483 508 return; 484 509 } 485 510 486 511 if (buffer[1] != 0x80) { 487 cs_log(" handlesockmsg()unknown apdu tag");512 cs_log("dvbapi: unknown apdu tag"); 488 513 return; 489 514 } … … 509 534 dvbapi_parse_capmt(buffer + 3 + size, val); 510 535 else 511 cs_log(" handlesockmsg()ca_pmt invalid length");536 cs_log("dvbapi: ca_pmt invalid length"); 512 537 } 513 538 else if (buffer[2] == 0x3f) … … 569 594 570 595 // if message begins with an apdu_tag and is longer than three bytes 596 571 597 if ((buffer[0] == 0x9F) && ((buffer[1] >> 7) == 0x01) && ((buffer[2] >> 7) == 0x00)) { 572 598 dvbapi_handlesockmsg(buffer, len); … … 579 605 } 580 606 581 582 607 demux_search dvbapi_find_dmx_by_fd(int fd) 583 608 { 584 609 int i; 585 610 demux_search s1; 611 612 s1.type=0; 613 s1.index=0; 614 586 615 for (i=0;i<MAX_DEMUX;i++) { 587 616 if (demux[i].demux_ecm_fd==fd) { … … 596 625 } 597 626 } 598 627 599 628 return s1; 600 629 } … … 603 632 { 604 633 int i; 605 for (i=0;i<MAX_DEMUX;i++) 634 for (i=0;i<MAX_DEMUX;i++) 606 635 if (demux[i].program_number==prognr) 607 636 return i; 608 637 609 638 return -1; 610 639 } … … 622 651 pfdcount=0; 623 652 for (i=0;i<MAX_DEMUX;i++) { 653 if (demux[i].ca_system_id==0) continue; // ignore inactive tuner 654 624 655 if (demux[i].demux_ecm_fd>0) { 625 656 pfd2[pfdcount].fd = demux[i].demux_ecm_fd; … … 631 662 pfd2[pfdcount].events = (POLLIN | POLLPRI); 632 663 pfdcount++; 633 } 634 664 } 665 635 666 } 636 667 … … 640 671 if (pfd2[i].revents & (POLLIN | POLLPRI)) { 641 672 s1=dvbapi_find_dmx_by_fd(pfd2[i].fd); 673 674 if ((len=dvbapi_read_device(pfd2[i].fd, buffer, BUFSIZE, 0)) <= 0) 675 break; 676 642 677 if (s1.type==0) { 678 643 679 //ECM 644 if ((len = read(pfd2[i].fd, buffer, BUFSIZE)) <= 0) 645 break; 646 680 647 681 if (len != (((buffer[1] & 0xf) << 8) | buffer[2]) + 3) //invaild CAT length 648 682 break; … … 652 686 if (memcmp(buffer, demux[s1.index].buffer_cache_dmx, 12) != 0) { 653 687 memcpy(demux[s1.index].buffer_cache_dmx, buffer, 12); 654 if (!dvbapi_parse_ecm(s1.index,buffer,len)) { cs_log("Error while parsing ECM"); } 688 //if (!dvbapi_parse_ecm(s1.index,buffer,len)) { cs_log("Error while parsing ECM"); } 689 cs_debug("Read %d bytes\tTable-id: %02x\tCA section length: %d", len, buffer[0], len); 690 691 if (len>0) { 692 ECM_REQUEST *er; 693 694 if (!(er=get_ecmtask())) 695 break; 696 697 er->srvid = demux[s1.index].program_number; 698 er->caid = demux[s1.index].ca_system_id; 699 //er->prid = demux[s1.index].provider_id; 700 701 er->l=len; 702 memcpy(er->ecm, buffer, er->l); 703 704 get_cw(er); 705 } 655 706 } 656 707 } 657 658 708 } 659 709 if (s1.type==1) { 710 660 711 //EMM 661 if ((len = read(pfd2[i].fd, buffer, BUFSIZE)) <= 0) 712 713 if (cfg->dvbapi_au!=1) 662 714 break; 663 715 664 if (len != (((buffer[1] & 0xf) << 8) | buffer[2]) + 3) //invaild CAT length 665 break; 666 667 /* 668 //nagra only??? 669 int emmtype; 670 if( (buffer[0]==0x82) ) emmtype = 0; // U 671 if( (buffer[0]==0x83) && (buffer[7]==0x10) ) emmtype = 1; // S 672 if( (buffer[0]==0x83) && (buffer[7]==0x00) ) emmtype = 2; // G 673 */ 674 675 cs_log("EMM Type: 0x%02x", buffer[0]); 676 716 cs_debug("EMM Type: 0x%02x", buffer[0]); 717 718 cs_ddump(buffer, len, "emm:"); 719 677 720 //force emm output 721 678 722 reader[ridx].logemm=9999; 679 723 … … 682 726 epg.caid[0] = (uchar)(demux[s1.index].ca_system_id>>8); 683 727 epg.caid[1] = (uchar)(demux[s1.index].ca_system_id); 684 if (reader[client[cs_idx].au].caid[0]!=b2i(2,epg.caid)) cs_log("caid %04x", b2i(2,epg.caid));728 //if (reader[client[cs_idx].au].caid[0]!=b2i(2,epg.caid)) cs_log("caid %04x", b2i(2,epg.caid)); 685 729 //memcpy(epg.provid, prov, 4); 686 730 … … 689 733 memcpy(epg.hexserial, reader[client[cs_idx].au].hexserial, 8); 690 734 691 do_emm(&epg);735 //do_emm(&epg); 692 736 693 737 } … … 699 743 return 0; 700 744 } 701 702 745 703 746 int dvbapi_main_local() … … 711 754 712 755 if (cfg->dvbapi_usr[0]==0) { 713 // 714 } 715 716 717 for (i=0;i<MAX_DEMUX;i++) { 718 756 // 757 } 758 759 for (i=0;i<MAX_DEMUX;i++) 760 { 719 761 demux[i].program_number=0; 720 762 demux[i].demux_ecm_fd=0; … … 725 767 demux[i].cadev_index=-1; 726 768 demux[i].ca_fd=0; 769 demux[i].received_emm=0; 770 727 771 memset(demux[i].buffer_cache_dmx,0 ,12); 728 729 for (i=0;i<20;i++) //clean ECMpids array 730 { 731 demux[i].ECMpids[i].CA_PID = 0; 732 demux[i].ECMpids[i].CA_System_ID = 0; 733 } 734 735 } 736 737 if (!dvbapi_init_listenfd()) return 1; 772 } 773 774 if (!dvbapi_init_listenfd()) 775 { 776 cs_log("dvbapi: could not init camd.socket."); 777 return 1; 778 } 738 779 739 780 pfd2[0].fd = fd_m2c; … … 745 786 746 787 while (1) { 747 if (master_pid!=getppid()) { 748 cs_log("master died"); 788 if (master_pid!=getppid()) 749 789 cs_exit(0); 750 }751 790 752 791 rc=poll(pfd2, 1, 500); … … 764 803 765 804 766 void dvbapi_send_dcw(ECM_REQUEST *er) { 805 void dvbapi_send_dcw(ECM_REQUEST *er) 806 { 767 807 unsigned char cw_0[8], cw_1[8]; 808 809 //cs_debug("dvbapi: ECM rc: %d", er->rc); 768 810 769 811 memcpy(cw_0, er->cw, 8); 770 812 memcpy(cw_1, er->cw+8, 8); 771 813 814 //this is not working when both tuner on one channel 815 816 int demux_index=dvbapi_get_index_by_prgnr(er->srvid); 817 if (demux_index>=0) { 818 if (er->rc==0 && demux[demux_index].ca_system_id==0) { 819 dvbapi_start_descramble(demux_index, er->caid, er->pid, er->prid); 820 } 821 } else { 822 cs_log("dvbapi: error cant find demux index"); 823 } 824 825 if (er->rc!=0) 826 return; 827 772 828 ca_descr_t ca_descr; 773 829 memset(&ca_descr,0,sizeof(ca_descr)); 774 830 775 //this is not working when both tuner on one channel 776 int demux_index=dvbapi_get_index_by_prgnr(er->srvid); 777 if (demux_index>=0) { 778 if (er->rc==0 && demux[demux_index].ca_system_id==0) 779 dvbapi_start_descramble(demux_index, er->caid, er->pid); 780 } else { 781 cs_log("error cant find demux index"); 831 if (demux[demux_index].ca_fd<=0) 832 { 833 cs_log("dvbapi: could not write cw."); 834 return; 782 835 } 783 836 784 837 if (memcmp(cw_0,demux[demux_index].lastcw0,8)) 785 838 { 786 ca_descr.index = 0;839 ca_descr.index = demux_index; 787 840 ca_descr.parity = 0; 788 841 memcpy(demux[demux_index].lastcw0,cw_0,8); 789 842 memcpy(ca_descr.cw,cw_0,8); 790 if (ioctl(demux[demux_index].ca_fd, CA_SET_DESCR, &ca_descr) < 0) perror("CA_SET_DESCR");843 if (ioctl(demux[demux_index].ca_fd, CA_SET_DESCR, &ca_descr) < 0) cs_debug("dvbapi: Error CA_SET_DESCR"); 791 844 } 792 845 793 846 if (memcmp(cw_1,demux[demux_index].lastcw1,8)) 794 847 { 795 ca_descr.index = 0;848 ca_descr.index = demux_index; 796 849 ca_descr.parity = 1; 797 850 memcpy(demux[demux_index].lastcw1,cw_1,8); 798 851 memcpy(ca_descr.cw,cw_1,8); 799 if (ioctl(demux[demux_index].ca_fd, CA_SET_DESCR, &ca_descr) < 0) perror("CA_SET_DESCR"); 800 } 801 802 } 803 804 static void dvbapi_handler(int idx) { 852 if (ioctl(demux[demux_index].ca_fd, CA_SET_DESCR, &ca_descr) < 0) cs_debug("dvbapi: Error CA_SET_DESCR"); 853 } 854 855 } 856 857 static void dvbapi_handler(int idx) 858 { 805 859 static struct s_auth *account=0; 806 860
Note:
See TracChangeset
for help on using the changeset viewer.