Changeset 1618
- Timestamp:
- 02/19/10 17:51:22 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-dvbapi.c
r1584 r1618 23 23 #include "globals.h" 24 24 25 #define BUFSIZE 102425 #define BUFSIZE 512 26 26 #define MAX_DEMUX 5 27 27 #define MAX_CAID 50 … … 57 57 unsigned char lastcw0[8]; 58 58 unsigned char lastcw1[8]; 59 pthread_t descramble_thread; 60 unsigned int thread_active; 59 61 } DEMUXTYPE; 60 62 #define DMX_FILTER_SIZE 16 … … 127 129 128 130 unsigned short global_caid_list[MAX_CAID]; 129 CAIDTAB prioritytab; 130 unsigned short ignoretab[CS_MAXCAIDTAB]; 131 CAIDTAB prioritytab,ignoretab; 131 132 132 133 #define BOX_COUNT 2 … … 249 250 int dvbapi_read_device(int dmx_fd, unsigned char *buf, int length, int debug) 250 251 { 251 int len; 252 len=read(dmx_fd, buf, length); 252 int len, rc; 253 struct pollfd pfd[1]; 254 255 pfd[0].fd = dmx_fd; 256 pfd[0].events = (POLLIN | POLLPRI); 257 258 rc = poll(pfd, 1, 5000); 259 if (rc<1) 260 return -1; 261 262 len = read(dmx_fd, buf, length); 253 263 254 264 if (len==-1) … … 362 372 int dmx_fd, len; 363 373 364 dmx_fd=demux[demux_index].demux_e cm_fd;374 dmx_fd=demux[demux_index].demux_emm_fd; 365 375 366 376 dvbapi_set_filter(dmx_fd, selected_api, 0x0001, 0x01, 0xFF, 2000); … … 387 397 } 388 398 399 dvbapi_stop_filter(demux_index, 1); 400 389 401 return; 390 402 } … … 404 416 405 417 if (demux[demux_id].demux_ecm_fd>0) { 406 ioctl(demux[demux_id].demux_ecm_fd,DMX_STOP);418 dvbapi_stop_filter(demux_id, 0); 407 419 close(demux[demux_id].demux_ecm_fd); 408 420 demux[demux_id].demux_ecm_fd=0; … … 410 422 411 423 if (demux[demux_id].demux_emm_fd>0) { 412 ioctl(demux[demux_id].demux_emm_fd,DMX_STOP);424 dvbapi_stop_filter(demux_id, 1); 413 425 close(demux[demux_id].demux_emm_fd); 414 426 demux[demux_id].demux_emm_fd=0; 427 } 428 429 if (demux[demux_id].thread_active == 0) { 430 pthread_cancel(demux[demux_id].descramble_thread); 431 pthread_join(demux[demux_id].descramble_thread, NULL); 432 demux[demux_id].thread_active = -1; 415 433 } 416 434 … … 464 482 demux[demux_index].provider_id=provider_id; 465 483 466 467 484 int camfd=dvbapi_open_device(demux_index,1); 468 485 if (camfd<=0) { … … 499 516 500 517 dvbapi_stop_filter(demux_index,0); 501 dvbapi_stop_filter(demux_index,1);502 518 503 519 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); … … 512 528 } 513 529 514 if (cfg->dvbapi_au==1) 515 {530 if (cfg->dvbapi_au==1) { 531 dvbapi_stop_filter(demux_index,1); 516 532 if (demux[demux_index].ECMpids[n].EMM_PID>0) 517 533 provid=dvbapi_get_provid(demux_index, demux[demux_index].ECMpids[n].EMM_PID); 518 534 } 519 535 520 //cs_log("Provider ID: %04x", provid);521 522 536 //grep ecm 523 537 dvbapi_get_single_ecm(demux_index, demux[demux_index].ECMpids[n].CA_System_ID, demux[demux_index].ECMpids[n].CA_PID, provid); … … 530 544 { 531 545 int demux_index=(int)di; 532 int dmx1_fd,dmx2_fd ,n=30,k=0;546 int dmx1_fd,dmx2_fd=0,n=30,k=0; 533 547 unsigned int program_number; 534 548 549 pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); 550 pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); 551 535 552 cs_debug("dvbapi: Start descrambling Thread %d", demux_index); 536 553 537 dmx1_fd = dvbapi_open_device(demux_index,0); //ECM,CAT 538 dmx2_fd = dvbapi_open_device(demux_index,0); //EMM 539 554 dmx1_fd = dvbapi_open_device(demux_index,0); //ECM 540 555 demux[demux_index].demux_ecm_fd=dmx1_fd; 541 demux[demux_index].demux_emm_fd=dmx2_fd; 542 543 dvbapi_parse_cat(demux_index); 556 557 if (cfg->dvbapi_au==1) { 558 dmx2_fd = dvbapi_open_device(demux_index,0); //EMM,CAT 559 demux[demux_index].demux_emm_fd=dmx2_fd; 560 dvbapi_parse_cat(demux_index); 561 } 544 562 545 563 program_number=demux[demux_index].program_number; … … 569 587 } 570 588 571 572 struct pollfd pfd2[MAX_DEMUX*2]; 589 struct pollfd pfd2[2]; 573 590 int rc,len,i,pfdcount; 574 591 unsigned char buffer[BUFSIZE]; … … 576 593 while(1) 577 594 { 578 579 595 pfdcount=0; 580 596 … … 587 603 pfdcount++; 588 604 } else break; 589 if (demux[demux_index].demux_emm_fd>0) { 590 pfd2[pfdcount].fd = demux[demux_index].demux_emm_fd; 591 pfd2[pfdcount].events = (POLLIN | POLLPRI); 592 pfdcount++; 593 } else break; 594 595 596 rc=poll(pfd2, pfdcount, 1000); 605 if (cfg->dvbapi_au==1) { 606 if (demux[demux_index].demux_emm_fd>0) { 607 pfd2[pfdcount].fd = demux[demux_index].demux_emm_fd; 608 pfd2[pfdcount].events = (POLLIN | POLLPRI); 609 pfdcount++; 610 } else break; 611 } 612 613 rc=poll(pfd2, pfdcount, 3000); 614 615 if (rc<0) 616 break; 597 617 598 618 for (i = 0; i < pfdcount; i++) { … … 614 634 cs_debug("Read %d bytes\tTable-id: %02x\tCA section length: %d", len, buffer[0], len); 615 635 616 if (len>0) { 617 ECM_REQUEST *er; 618 619 if (!(er=get_ecmtask())) 620 continue; 621 622 er->srvid = demux[demux_index].program_number; 623 er->caid = demux[demux_index].ca_system_id; 624 er->prid = demux[demux_index].provider_id; 625 626 er->l=len; 627 memcpy(er->ecm, buffer, er->l); 628 629 get_cw(er); 630 } 636 ECM_REQUEST *er; 637 638 if (!(er=get_ecmtask())) 639 continue; 640 641 er->srvid = demux[demux_index].program_number; 642 er->caid = demux[demux_index].ca_system_id; 643 er->prid = demux[demux_index].provider_id; 644 645 er->l=len; 646 memcpy(er->ecm, buffer, er->l); 647 648 get_cw(er); 631 649 } 632 650 } … … 635 653 //EMM 636 654 637 if (cfg->dvbapi_au!=1)638 continue;639 640 655 cs_debug("EMM Type: 0x%02x", buffer[0]); 641 642 656 cs_ddump(buffer, len, "emm:"); 643 657 … … 665 679 cs_debug("dvbapi: Stop descrambling Thread %d", demux_index); 666 680 667 return 0; 681 pthread_detach(pthread_self()); 682 pthread_exit(0); 668 683 } 669 684 … … 688 703 if (k+1>=MAX_CAID) break; 689 704 global_caid_list[k]=reader[i].caid[j]; 690 k++; 691 705 k++; 692 706 } 693 707 } 694 708 } 695 709 for (n=0; n<demux[demux_index].ECMpidcount; n++) { 696 if (dvbapi_check_array(ignoretab , CS_MAXCAIDTAB, demux[demux_index].ECMpids[n].CA_System_ID)>=0) {710 if (dvbapi_check_array(ignoretab.caid, CS_MAXCAIDTAB, demux[demux_index].ECMpids[n].CA_System_ID)>=0) { 697 711 cs_debug("-> ignore %04x", demux[demux_index].ECMpids[n].CA_System_ID); 698 712 } else if (dvbapi_check_array(global_caid_list, MAX_CAID, demux[demux_index].ECMpids[n].CA_System_ID)>=0) { … … 725 739 } 726 740 741 void dvbapi_parse_descriptor(int demux_id, int i, unsigned int info_length, unsigned char *buffer) { 742 //int ca_pmt_cmd_id = buffer[i + 5]; 743 unsigned int descriptor_length=0; 744 ushort added,j,n; 745 746 for (j = 0; j < info_length - 1; j += descriptor_length + 2) { 747 descriptor_length = buffer[i + j + 7]; 748 int descriptor_ca_system_id = (buffer[i + j + 8] << 8) | buffer[i + j + 9]; 749 int descriptor_ca_pid = ((buffer[i + j + 10] & 0x1F) << 8) | buffer[i + j + 11]; 750 751 cs_debug("typ: %02x\tca_system_id: %04x\t ca_pid: %04x", buffer[i + j + 6], descriptor_ca_system_id, descriptor_ca_pid); 752 753 if (buffer[i + j + 6] == 0x09) { 754 added=0; 755 for (n=0;n<demux[demux_id].ECMpidcount;n++) { 756 if (demux[demux_id].ECMpids[n].CA_System_ID==descriptor_ca_system_id) 757 added=1; 758 } 759 if (added==0) { 760 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CA_PID=descriptor_ca_pid; 761 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CA_System_ID=descriptor_ca_system_id; 762 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].EMM_PID=0; 763 demux[demux_id].ECMpidcount++; 764 } 765 } 766 } 767 } 768 727 769 // from tuxbox camd 728 770 int dvbapi_parse_capmt(unsigned char *buffer, unsigned int length) 729 771 { 730 unsigned short i, j, u, n, added;772 unsigned short i, u; 731 773 unsigned short ca_mask=0x01, demux_index2=0x00; 732 774 … … 761 803 762 804 for (i=0;i<MAX_DEMUX;i++) { 763 if (demux[i].demux_index==demux_index2) { 764 if (demux[i].program_number==((buffer[1] << 8) | buffer[2])) { // already descrambling prog on this device 765 if (demux[i].active==1) { 766 //remove any inactive program 767 for (u=0;u<MAX_DEMUX;u++) { 768 if (demux[u].demux_index==demux_index2 && demux[u].active==0) 769 dvbapi_stop_descrambling(u); 770 demux[u].active=0; 771 } 772 773 } else 774 demux[i].active=1; 775 return 0; 776 } 805 if (demux[i].demux_index==demux_index2 && demux[i].program_number==((buffer[1] << 8) | buffer[2])) { // already descrambling prog on this device 806 if (demux[i].active==1) { 807 //remove any inactive program 808 for (u=0;u<MAX_DEMUX;u++) { 809 if (demux[u].demux_index==demux_index2 && demux[u].active==0) 810 dvbapi_stop_descrambling(u); 811 demux[u].active=0; 812 } 813 } else 814 demux[i].active=1; 815 return 0; 777 816 } 778 817 } … … 814 853 815 854 //CA_PIDS for all streams 816 if (program_info_length != 0) 817 { 818 int ca_pmt_cmd_id = buffer[6]; 819 cs_debug("ca_pmt_id: %02x", ca_pmt_cmd_id); 820 int descriptor_length=0; 821 for (i = 0; i < program_info_length - 1; i += descriptor_length + 2) 822 { 823 descriptor_length = buffer[i + 8]; 824 int ca_system_id = (buffer[i + 9] << 8) | buffer[i + 10]; 825 int ca_pid = ((buffer[i + 11] & 0x1F) << 8)| buffer[i + 12]; 826 827 cs_debug("typ: %02x ca_system_id: %04x\t ca_pid: %04x\tca_descriptor_length %d", buffer[i + 7], ca_system_id, ca_pid, descriptor_length); 828 829 if (buffer[i + 7] == 0x09) { 830 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CA_PID=ca_pid; 831 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CA_System_ID=ca_system_id; 832 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].EMM_PID=0; 833 demux[demux_id].ECMpidcount++; 834 } 835 } 855 if (program_info_length != 0) { 856 dvbapi_parse_descriptor(demux_id, 1, program_info_length, buffer); 836 857 } 837 858 … … 849 870 demux[demux_id].STREAMpidcount++; 850 871 851 if (es_info_length != 0) 852 { 853 int ca_pmt_cmd_id = buffer[i + 5]; 854 cs_debug("dvbapi: ca_pmt_cmd_id 0x%02x", ca_pmt_cmd_id); 855 unsigned int descriptor_length=0; 856 for (j = 0; j < es_info_length - 1; j += descriptor_length + 2) 857 { 858 descriptor_length = buffer[i + j + 7]; 859 int descriptor_ca_system_id = (buffer[i + j + 8] << 8) | buffer[i + j + 9]; 860 int descriptor_ca_pid = ((buffer[i + j + 10] & 0x1F) << 8) | buffer[i + j + 11]; 861 862 cs_debug("typ: %02x\tca_system_id: %04x\t ca_pid: %04x", buffer[i + j + 6], descriptor_ca_system_id, descriptor_ca_pid); 863 864 if (buffer[i + j + 6] == 0x09) { 865 added=0; 866 for (n=0;n<demux[demux_id].ECMpidcount;n++) { 867 if (demux[demux_id].ECMpids[n].CA_System_ID==descriptor_ca_system_id) 868 added=1; 869 } 870 if (added==0) { 871 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CA_PID=descriptor_ca_pid; 872 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CA_System_ID=descriptor_ca_system_id; 873 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].EMM_PID=0; 874 demux[demux_id].ECMpidcount++; 875 } 876 } 877 } 878 } 879 } 880 881 pthread_t p3; 882 883 cs_log("dvbapi: Found %d ECMpids in PMT", demux[demux_id].ECMpidcount); 884 cs_debug("dvbapi: Found %d STREAMpids in PMT", demux[demux_id].STREAMpidcount); 872 if (es_info_length != 0) { 873 dvbapi_parse_descriptor(demux_id, i, es_info_length, buffer); 874 } 875 } 876 877 cs_debug("dvbapi: Found %d ECMpids and %d STREAMpids in PMT", demux[demux_id].ECMpidcount); 885 878 886 879 if (demux[demux_id].ECMpidcount>0) { 887 880 dvbapi_resort_ecmpids(demux_id); 888 if (demux[demux_id].ECMpidcount>0) 889 pthread_create (&p3, NULL, thread_descrambling, (void*)demux_id); 890 } 891 881 if (demux[demux_id].ECMpidcount>0) {} 882 demux[demux_id].thread_active=pthread_create(&demux[demux_id].descramble_thread, NULL, thread_descrambling, (void*)demux_id); 883 } 892 884 893 885 return 0; … … 974 966 while(1) 975 967 { 976 cs_sleepms( 1000); // check every second968 cs_sleepms(500); 977 969 //cs_debug("dvbapi: check zap"); 978 970 … … 992 984 993 985 // if message begins with an apdu_tag and is longer than three bytes 994 995 986 if ((buffer[0] == 0x9F) && ((buffer[1] >> 7) == 0x01) && ((buffer[2] >> 7) == 0x00)) { 996 987 dvbapi_handlesockmsg(buffer, len); … … 1007 998 } 1008 999 1009 1000 void dvbapi_chk_caidtab(char *caidasc, CAIDTAB *ctab) { 1001 1002 char *ptr1, *ptr3; 1003 int i; 1004 1005 for (i=0, ptr1=strtok(caidasc, ","); (i<CS_MAXCAIDTAB) && (ptr1); ptr1=strtok(NULL, ",")) 1006 { 1007 unsigned long caid, prov; 1008 if( (ptr3=strchr(trim(ptr1), ':')) ) 1009 *ptr3++='\0'; 1010 else 1011 ptr3=""; 1012 1013 if (((caid=a2i(ptr1, 2))|(prov=a2i(ptr3, 3))) < 0x10000) 1014 { 1015 ctab->caid[i]=caid; 1016 ctab->mask[i]=prov; 1017 i++; 1018 } 1019 } 1020 } 1010 1021 1011 1022 int dvbapi_main_local() … … 1020 1031 1021 1032 if (cfg->dvbapi_boxtype[0]==0) { 1022 strncpy(cfg->dvbapi_boxtype, "dreambox", sizeof(cfg->dvbapi_boxtype)-1);1033 cs_strncpy(cfg->dvbapi_boxtype, "dreambox", sizeof(cfg->dvbapi_boxtype)); 1023 1034 cs_log("dvbapi: boxtype not set. Assume boxtype=%s.", cfg->dvbapi_boxtype); 1024 1035 } else … … 1036 1047 demux[i].ca_fd=0; 1037 1048 demux[i].demux_index=-1; 1038 1049 demux[i].thread_active = -1; 1039 1050 memset(demux[i].buffer_cache_dmx,0 ,12); 1040 1051 } … … 1053 1064 } 1054 1065 1055 char *ptr1, *ptr3; 1056 //priority 1057 for (i=0, ptr1=strtok(cfg->dvbapi_priority, ","); (i<CS_MAXCAIDTAB) && (ptr1); ptr1=strtok(NULL, ",")) 1058 { 1059 unsigned long caid, prov; 1060 if( (ptr3=strchr(trim(ptr1), ':')) ) 1061 *ptr3++='\0'; 1062 else 1063 ptr3=""; 1064 1065 if (((caid=a2i(ptr1, 2))|(prov=a2i(ptr3, 3))) < 0x10000) 1066 { 1067 prioritytab.caid[i]=caid; 1068 prioritytab.mask[i]=prov; 1069 i++; 1070 } 1071 } 1072 //ignore 1073 for (i=0, ptr1=strtok(cfg->dvbapi_ignore, ","); (i<CS_MAXCAIDTAB) && (ptr1); ptr1=strtok(NULL, ",")) 1074 { 1075 unsigned long caid, prov; 1076 if( (ptr3=strchr(trim(ptr1), ':')) ) 1077 *ptr3++='\0'; 1078 else 1079 ptr3=""; 1080 1081 if (((caid=a2i(ptr1, 2))|(prov=a2i(ptr3, 3))) < 0x10000) 1082 { 1083 ignoretab[i]=caid; 1084 i++; 1085 } 1086 } 1066 dvbapi_chk_caidtab(cfg->dvbapi_priority, &prioritytab); 1067 dvbapi_chk_caidtab(cfg->dvbapi_ignore, &ignoretab); 1087 1068 1088 1069 pfd2[0].fd = fd_m2c; … … 1099 1080 cs_exit(0); 1100 1081 1101 1102 1082 chk_pending(tp); 1103 1083 … … 1128 1108 memcpy(cw_1, er->cw+8, 8); 1129 1109 1130 for (i=0;i<MAX_DEMUX;i++) 1131 { 1132 if (demux[i].program_number==er->srvid) 1133 { 1134 1110 for (i=0;i<MAX_DEMUX;i++) { 1111 if (demux[i].program_number==er->srvid) { 1135 1112 if (er->rc<=2 && demux[i].ca_system_id==0 && er->caid!=0) { 1113 dvbapi_start_descrambling(i, er->caid, er->pid, er->prid); 1114 } 1115 1116 if (er->rc==4 && cfg->dvbapi_au==1 && dvbapi_check_array(global_caid_list, MAX_CAID, er->caid)>=0) { 1117 //local card and not found -> maybe card need emm 1136 1118 dvbapi_start_descrambling(i, er->caid, er->pid, er->prid); 1137 1119 } … … 1145 1127 memset(&ca_descr,0,sizeof(ca_descr)); 1146 1128 1147 if (demux[i].ca_fd<=0) 1148 { 1129 if (demux[i].ca_fd<=0) { 1149 1130 cs_log("dvbapi: could not write cw."); 1150 1131 return; 1151 1132 } 1152 1133 1153 if (memcmp(cw_0,demux[i].lastcw0,8)!=0 && memcmp(cw_0,nullcw,8)!=0) 1154 { 1134 if (memcmp(cw_0,demux[i].lastcw0,8)!=0 && memcmp(cw_0,nullcw,8)!=0) { 1155 1135 ca_descr.index = i; 1156 1136 ca_descr.parity = 0; … … 1162 1142 } 1163 1143 1164 if (memcmp(cw_1,demux[i].lastcw1,8)!=0 && memcmp(cw_1,nullcw,8)!=0) 1165 { 1144 if (memcmp(cw_1,demux[i].lastcw1,8)!=0 && memcmp(cw_1,nullcw,8)!=0) { 1166 1145 ca_descr.index = i; 1167 1146 ca_descr.parity = 1; … … 1197 1176 1198 1177 int ok=0; 1199 1200 1178 if( !account ) 1201 1179 {
Note:
See TracChangeset
for help on using the changeset viewer.