Changeset 2706
- Timestamp:
- 07/11/10 01:08:05 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-dvbapi.c
r2705 r2706 450 450 } 451 451 452 void dvbapi_parse_cat(int demux_index, uchar *buf, int len) { 453 unsigned short i, j; 452 void dvbapi_add_ecmpid(int demux_id, ushort caid, ushort ecmpid, ulong provid) { 453 int n,added=0; 454 455 for (n=0;n<demux[demux_id].ECMpidcount;n++) { 456 if (demux[demux_id].ECMpids[n].CAID == caid && demux[demux_id].ECMpids[n].ECM_PID == ecmpid) 457 added=1; 458 } 459 460 if (added==0) { 461 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].ECM_PID = ecmpid; 462 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CAID = caid; 463 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].PROVID = provid; 464 cs_log("[ADD PID %d] CAID: %04X\tECM_PID: %04X\tPROVID: %06X", demux[demux_id].ECMpidcount, caid, ecmpid, provid); 465 demux[demux_id].ECMpidcount++; 466 } 467 } 468 469 void dvbapi_add_emmpid(int demux_id, ushort caid, ushort emmpid, ulong provid) { 470 int j; 471 for (j=0;j<demux[demux_id].ECMpidcount;j++) { 472 if (demux[demux_id].ECMpids[j].CAID==caid && (demux[demux_id].ECMpids[j].PROVID == provid || provid == 0)) { 473 demux[demux_id].ECMpids[j].EMM_PID=emmpid; 474 cs_debug("[ADD EMMPID %d] CAID: %04X\tEMM_PID: %04X\tPROVID: %06X", j, caid, emmpid, provid); 475 } 476 } 477 } 478 479 void dvbapi_parse_cat(int demux_id, uchar *buf, int len) { 480 unsigned short i, k; 454 481 455 482 cs_ddump(buf, len, "cat:"); … … 457 484 for (i = 8; i < (((buf[1] & 0x0F) << 8) | buf[2]) - 1; i += buf[i + 1] + 2) { 458 485 if (buf[i] != 0x09) continue; 459 unsigned short ca t_sys_id=(((buf[i + 2] & 0x1F) << 8) | buf[i + 3]);486 unsigned short caid=(((buf[i + 2] & 0x1F) << 8) | buf[i + 3]); 460 487 unsigned short emm_pid=(((buf[i + 4] & 0x1F) << 8) | buf[i + 5]); 461 cs_debug("cat: ca_system_id: %04x\temm_pid %04x", cat_sys_id, emm_pid); 462 for (j=0;j<demux[demux_index].ECMpidcount;j++) { 463 if (demux[demux_index].ECMpids[j].CAID==(((buf[i + 2] & 0x1F) << 8) | buf[i + 3])) { 464 demux[demux_index].ECMpids[j].EMM_PID=emm_pid; 465 } 488 ulong emm_provider = 0; 489 490 switch (caid >> 8) { 491 case 0x01: 492 dvbapi_add_emmpid(demux_id, caid, emm_pid, 0); 493 cs_debug("[cat] CAID: %04x\tEMM_PID: %04x", caid, emm_pid); 494 for (k = i+7; k < i+buf[i+1]+2; k += 4) { 495 emm_provider = (buf[k+2] << 8| buf[k+3]); 496 emm_pid = (buf[k] & 0x0F) << 8 | buf[k+1]; 497 cs_debug("[cat] CAID: %04X\tEMM_PID: %04X\tPROVID: %06X", caid, emm_pid, emm_provider); 498 dvbapi_add_emmpid(demux_id, caid, emm_pid, emm_provider); 499 } 500 break; 501 case 0x05: 502 for (k = i+6; k < i+buf[i+1]+2; k += buf[k+1]+2) { 503 if (buf[k]==0x14) { 504 emm_provider = buf[k+2] << 16 | (buf[k+3] << 8| (buf[k+4] & 0xF0)); 505 cs_debug("[cat] CAID: %04x\tEMM_PID: %04x\tPROVID: %06X", caid, emm_pid, emm_provider); 506 dvbapi_add_emmpid(demux_id, caid, emm_pid, emm_provider); 507 } 508 } 509 break; 510 case 0x18: 511 emm_provider = (buf[i+1] == 0x07) ? (buf[i+6] << 16 | (buf[i+7] << 8| (buf[i+8]))) : 0; 512 cs_debug("[cat] CAID: %04x\tEMM_PID: %04x\tPROVID: %06X", caid, emm_pid, emm_provider); 513 dvbapi_add_emmpid(demux_id, caid, emm_pid, emm_provider); 514 break; 515 default: 516 cs_debug("[cat] CAID: %04x\tEMM_PID: %04x", caid, emm_pid); 517 dvbapi_add_emmpid(demux_id, caid, emm_pid, 0); 518 break; 466 519 } 467 520 } … … 635 688 } 636 689 637 void dvbapi_add_ecmpid(int demux_id, ushort caid, ushort ecmpid, ulong provid) { 638 int n,added=0; 639 640 for (n=0;n<demux[demux_id].ECMpidcount;n++) { 641 if (demux[demux_id].ECMpids[n].CAID == caid && demux[demux_id].ECMpids[n].ECM_PID == ecmpid) 642 added=1; 643 } 644 645 if (added==0) { 646 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].ECM_PID = ecmpid; 647 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CAID = caid; 648 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].PROVID = provid; 649 cs_log("[ADD PID %d] CAID: %04X\tECM_PID: %04X\tPROVID: %06X", demux[demux_id].ECMpidcount, caid, ecmpid, provid); 650 demux[demux_id].ECMpidcount++; 651 } 652 } 690 653 691 654 692 void dvbapi_parse_descriptor(int demux_id, int i, unsigned int info_length, unsigned char *buffer) { … … 683 721 if (descriptor_ca_system_id >> 8 == 0x05 && descriptor_length == 0x0F && buffer[index + 12] == 0x14) 684 722 descriptor_ca_provider = buffer[index + 14] << 16 | (buffer[index + 15] << 8| (buffer[index + 16] & 0xF0)); 723 724 if (descriptor_ca_system_id >> 8 == 0x18 && descriptor_length == 0x07) 725 descriptor_ca_provider = buffer[index + 6] << 16 | (buffer[index + 7] << 8| (buffer[index + 8])); 685 726 686 727 dvbapi_add_ecmpid(demux_id, descriptor_ca_system_id, descriptor_ca_pid, descriptor_ca_provider); … … 943 984 int i, pmt_fd; 944 985 986 signal=signal; 945 987 pthread_mutex_lock(&event_handler_lock); 946 988 … … 976 1018 977 1019 while ((dp = readdir(dirp))) { 1020 if (disable_pmt_files) 1021 break; 978 1022 if (strlen(dp->d_name) < 7) 979 1023 continue; … … 1057 1101 } 1058 1102 closedir(dirp); 1059 1103 pthread_mutex_unlock(&event_handler_lock); 1060 1104 } 1061 1105 … … 1109 1153 cs_debug("receiving cat"); 1110 1154 dvbapi_parse_cat(demux_id, buffer, len); 1111 if (demux[demux_id].pidindex < 0)1112 return;1113 1155 1114 1156 dvbapi_stop_filternum(demux_id, filter_num); … … 1168 1210 sigaction(SIGRTMIN + 1, &signal_action, NULL); 1169 1211 1170 1171 1172 1173 1212 pthread_mutexattr_t attr; 1213 pthread_mutexattr_init(&attr); 1214 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); 1215 pthread_mutex_init(&event_handler_lock, &attr); 1174 1216 1175 1217 dir_fd = open(TMPDIR, O_RDONLY); … … 1317 1359 } 1318 1360 1319 if (er->rc==4 && cfg->dvbapi_au==1 && dvbapi_check_array(global_caid_list, MAX_CAID, er->caid)>=0 ) {1361 if (er->rc==4 && cfg->dvbapi_au==1 && dvbapi_check_array(global_caid_list, MAX_CAID, er->caid)>=0 && er->caid!=0x0500 && er->caid!=0x0100) { 1320 1362 //local card and not found -> maybe card need emm 1321 1363 dvbapi_start_descrambling(i, er->caid, er->pid); … … 1381 1423 else 1382 1424 fprintf(ecmtxt, "from: local\n"); 1383 fprintf(ecmtxt, "protocol: % d\n", reader[er->reader[0]].typ);1425 fprintf(ecmtxt, "protocol: %s\n", reader[er->reader[0]].ph.desc); 1384 1426 fprintf(ecmtxt, "hops: %d\n", reader[er->reader[0]].cc_currenthops); 1385 1427 fprintf(ecmtxt, "ecm time: %.3f\n", (float) client[cs_idx].cwlastresptime/1000);
Note:
See TracChangeset
for help on using the changeset viewer.