Changeset 1678 for branches/monitor-improvement/module-dvbapi.c
- Timestamp:
- 02/24/10 21:52:38 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/monitor-improvement/module-dvbapi.c
r1662 r1678 147 147 int dvbapi_set_filter(int dmx_fd, int api, unsigned short pid, unsigned char filt, unsigned char mask, int timeout) 148 148 { 149 int command,ret=-1;149 int ret=-1; 150 150 151 151 cs_debug("dvbapi: set filter pid:%04x, value:%04x",pid, filt); … … 154 154 { 155 155 case 0: 156 //dvbapi 3 157 command=0; 156 api=api; 158 157 struct dmx_sct_filter_params sFP2; 159 158 … … 169 168 break; 170 169 case 1: 171 //dvbapi 1 172 command=0; 170 api=api; 173 171 struct dmxSctFilterParams sFP1; 174 172 … … 225 223 if (dmx_fd < 0) return 0; 226 224 227 int command,ret=0;225 int ret=0; 228 226 229 227 for (i=0;i<num_apis;i++) … … 533 531 } 534 532 533 void dvbapi_process_emm (int demux_index, unsigned char *buffer, unsigned int len) { 534 int i; 535 cs_debug("dvbapi: EMM Type: 0x%02x caid: %04x", buffer[0],demux[demux_index].ca_system_id); 536 cs_ddump(buffer, len, "emm:"); 537 538 //force emm output 539 reader[ridx].logemm=9999; 540 541 memset(&epg, 0, sizeof(epg)); 542 epg.caid[0] = (uchar)(demux[demux_index].ca_system_id>>8); 543 epg.caid[1] = (uchar)(demux[demux_index].ca_system_id); 544 545 epg.provid[1] = (uchar)(demux[demux_index].provider_id>>16); 546 epg.provid[2] = (uchar)(demux[demux_index].provider_id>>8); 547 epg.provid[3] = (uchar)(demux[demux_index].provider_id); 548 549 epg.l=len; 550 memcpy(epg.emm, buffer, epg.l); 551 552 for (i=0;i<CS_MAXREADER;i++) { 553 if (reader[i].caid[0] == demux[demux_index].ca_system_id) { 554 client[cs_idx].au=i; 555 memcpy(epg.hexserial, reader[client[cs_idx].au].hexserial, 8); 556 } 557 } 558 559 switch(demux[demux_index].ca_system_id >> 8) { 560 case 0x18: // NAGRA EMM 561 epg.l=len; 562 int emm_shared = (buffer[7] == 0x10); 563 uchar cam_id[4]; 564 565 switch(buffer[0]) { 566 case 0x82: 567 //emm-s 568 cs_debug("dvbapi: NAGRA shared emm"); 569 //do_emm(&epg); 570 break; 571 case 0x83: 572 //emm-u/g 573 cam_id[0] = buffer[5]; cam_id[1] = buffer[4]; cam_id[2] = buffer[3]; cam_id[3] = buffer[6]; 574 cs_debug("dvbapi: NAGRA %s EMM for camid: %02X %02X %02X %02X", emm_shared ? "group" : "user", cam_id[0], cam_id[1], cam_id[2], cam_id[3]); 575 if (epg.hexserial[2]==cam_id[0] && epg.hexserial[3]==cam_id[1] && epg.hexserial[4]==cam_id[2]) { 576 if (emm_shared==1) { 577 //do_emm(&epg); 578 cs_debug("dvbapi: do nagra user emm"); 579 } 580 if (emm_shared==0 && epg.hexserial[5] == cam_id[3]) { 581 //do_emm(&epg); 582 cs_debug("dvbapi: do nagra group emm"); 583 } 584 } 585 break; 586 default: 587 cs_debug("dvbapi: unknown Nagra EMM (skipped)"); 588 break; 589 } 590 break; 591 case 0x06: //Irdeto EMM 592 case 0x01: //Seca EMM 593 do_emm(&epg); 594 break; 595 case 0x0D: 596 cs_debug("dvbapi: CrytoWorks EMM (skipped)"); 597 break; 598 case 0x05: 599 cs_debug("dvbapi: Viaccess EMM (skipped)"); 600 break; 601 case 0x09: 602 cs_debug("dvbapi: Videoguard EMM (skipped)"); 603 break; 604 default: 605 cs_debug("dvbapi: Unknown EMM (skipped)"); 606 break; 607 } 608 } 609 535 610 void *thread_descrambling(void *di) 536 611 { … … 555 630 program_number=demux[demux_index].program_number; 556 631 557 while(1) 558 { 632 while(1) { 559 633 if (demux[demux_index].ca_system_id!=0) // got valid cw -> stop trying 560 634 break; … … 583 657 unsigned char buffer[BUFSIZE]; 584 658 585 while(1) 586 { 659 while(1) { 587 660 pfdcount=0; 588 661 … … 643 716 } 644 717 if (pfd2[i].fd==demux[demux_index].demux_emm_fd) { 645 //EMM 646 647 cs_debug("EMM Type: 0x%02x", buffer[0]); 648 cs_ddump(buffer, len, "emm:"); 649 650 //force emm output 651 reader[ridx].logemm=9999; 652 653 memset(&epg, 0, sizeof(epg)); 654 655 epg.caid[0] = (uchar)(demux[demux_index].ca_system_id>>8); 656 epg.caid[1] = (uchar)(demux[demux_index].ca_system_id); 657 658 epg.provid[2] = (uchar)(demux[demux_index].provider_id>>8); 659 epg.provid[3] = (uchar)(demux[demux_index].provider_id); 660 661 epg.l=len; 662 memcpy(epg.emm, buffer, epg.l); 663 memcpy(epg.hexserial, reader[client[cs_idx].au].hexserial, 8); 664 665 do_emm(&epg); 718 dvbapi_process_emm(demux_index, buffer, len); 666 719 } 667 720 } … … 882 935 883 936 884 void dvbapi_handlesockmsg (unsigned char *buffer, unsigned int len) 885 { 886 unsigned int val, size, i; 937 void dvbapi_handlesockmsg (unsigned char *buffer, unsigned int len) { 938 unsigned int val=0, size=0, i, k; 887 939 888 940 //cs_dump(buffer, len, "handlesockmsg:"); 889 890 if (buffer[0] != 0x9F || buffer[1] != 0x80) { 891 cs_log("dvbapi: unknown socket command: %02x", buffer[0]); 892 return; 893 } 894 895 if (buffer[3] & 0x80) { 896 val = 0; 897 size = buffer[3] & 0x7F; 898 for (i = 0; i < size; i++) 899 val = (val << 8) | buffer[i + 1 + 3]; 900 size++; 901 } else 902 { 903 val = buffer[3] & 0x7F; 904 size = 1; 905 } 906 907 switch(buffer[2]) 908 { 909 case 0x30: 910 cs_debug("ca_info!!"); 911 break; 912 case 0x32: 913 if ((3 + size + val) == len) 941 for (k = 0; k < len; k += 3 + size + val) { 942 if (buffer[0+k] != 0x9F || buffer[1+k] != 0x80) { 943 cs_log("dvbapi: unknown socket command: %02x", buffer[0+k]); 944 return; 945 } 946 947 if (buffer[3+k] & 0x80) { 948 val = 0; 949 size = buffer[3+k] & 0x7F; 950 for (i = 0; i < size; i++) 951 val = (val << 8) | buffer[i + 1 + 3 + k]; 952 size++; 953 } else { 954 val = buffer[3+k] & 0x7F; 955 size = 1; 956 } 957 958 switch(buffer[2+k]) { 959 case 0x32: 914 960 dvbapi_parse_capmt(buffer + 3 + size, val); 915 else { 916 cs_log("dvbapi: ca_pmt invalid length"); 917 cs_dump(buffer, len, "invalid length:"); 918 } 919 break; 920 case 0x3f: 921 //9F 80 3f 04 83 02 00 <demux index> 922 cs_ddump(buffer, len, "capmt 3f:"); 923 int demux_index=buffer[7]; 924 dvbapi_stop_descrambling_all(demux_index); 925 break; 926 default: 927 cs_log("dvbapi: handlesockmsg() unknown command"); 928 cs_dump(buffer, len, "unknown command:"); 929 break; 961 break; 962 case 0x3f: 963 //9F 80 3f 04 83 02 00 <demux index> 964 cs_ddump(buffer, len, "capmt 3f:"); 965 int demux_index=buffer[7+k]; 966 dvbapi_stop_descrambling_all(demux_index); 967 break; 968 default: 969 cs_log("dvbapi: handlesockmsg() unknown command"); 970 cs_dump(buffer, len, "unknown command:"); 971 break; 972 } 930 973 } 931 974 } 932 975 933 976 int dvbapi_init_listenfd() { 934 935 977 int clilen; 936 978 struct sockaddr_un servaddr;
Note:
See TracChangeset
for help on using the changeset viewer.