Changeset 1186 for branches/smartreader/module-dvbapi.c
- Timestamp:
- 01/11/10 17:55:21 (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/smartreader/module-dvbapi.c
r1119 r1186 35 35 #define BUFSIZE 1024 36 36 #define MAX_DEMUX 5 37 #define MAX_CAID 50 38 #define TAB_SIZE 30 39 #define ECM_PIDS 20 37 40 38 41 static int listenfd = -1; … … 40 43 typedef struct ECMPIDS 41 44 { 42 int CA_PID;43 int CA_System_ID;44 int EMM_PID;45 unsigned short CA_PID; 46 unsigned short CA_System_ID; 47 unsigned short EMM_PID; 45 48 } ECMPIDSTYPE; 46 49 … … 54 57 int active; 55 58 int ECMpidcount; 56 ECMPIDSTYPE ECMpids[ 20];59 ECMPIDSTYPE ECMpids[ECM_PIDS]; 57 60 unsigned int program_number; 58 61 unsigned int ca_system_id; … … 61 64 unsigned int emm_pid; 62 65 int STREAMpidcount; 63 short STREAMpids[ 20];66 short STREAMpids[ECM_PIDS]; 64 67 unsigned char buffer_cache_dmx[12]; 65 68 unsigned char lastcw0[8]; … … 134 137 DEMUXTYPE demux[MAX_DEMUX]; 135 138 139 unsigned short global_caid_list[MAX_CAID]; 140 unsigned short prioritytab[TAB_SIZE], ignoretab[TAB_SIZE]; 141 136 142 #define BOX_COUNT 2 137 143 struct box_devices … … 150 156 int selected_api=-1; 151 157 152 int dvbapi_set_filter(int dmx_fd, int api, int pid, unsigned char filt, unsigned char mask, int timeout)153 { 154 int command,ret ;158 int dvbapi_set_filter(int dmx_fd, int api, unsigned short pid, unsigned char filt, unsigned char mask, int timeout) 159 { 160 int command,ret=-1; 155 161 156 162 cs_debug("dvbapi: set filter pid:%04x, value:%04x",pid, filt); … … 159 165 { 160 166 case 0: 167 //dvbapi 3 168 command=0; 169 struct dmx_sct_filter_params sFP2; 170 171 memset(&sFP2,0,sizeof(sFP2)); 172 173 sFP2.pid = pid; 174 sFP2.timeout = timeout; 175 sFP2.flags = DMX_IMMEDIATE_START; 176 sFP2.filter.filter[0] = filt; 177 sFP2.filter.mask[0] = mask; 178 ret=ioctl(dmx_fd, DMX_SET_FILTER, &sFP2); 179 180 break; 181 case 1: 161 182 //dvbapi 1 162 183 command=0; … … 173 194 174 195 break; 175 case 1:176 //dvbapi 3177 command=0;178 struct dmx_sct_filter_params sFP2;179 180 memset(&sFP2,0,sizeof(sFP2));181 182 sFP2.pid = pid;183 sFP2.timeout = timeout;184 sFP2.flags = DMX_IMMEDIATE_START;185 sFP2.filter.filter[0] = filt;186 sFP2.filter.mask[0] = mask;187 ret=ioctl(dmx_fd, DMX_SET_FILTER, &sFP2);188 189 break;190 196 default: 191 197 break; … … 193 199 194 200 if (ret < 0) 195 cs_ log("dvbapi: could not start demux filter (Errno: %d)", errno);201 cs_debug("dvbapi: could not start demux filter (Errno: %d)", errno); 196 202 197 203 return ret; … … 235 241 selected_box=devnum; 236 242 selected_api=apinum; 237 cs_ log("Detect %s Api: %d", devices[devnum].demux_device_path, apinum);243 cs_debug("dvbapi: Detected %s Api: %d", device_path, apinum); 238 244 239 245 return 1; … … 267 273 ca_offset=1; 268 274 269 sprintf(device_path, devices[selected_box].ca_device_path, demux[index_demux]. demux_index+ca_offset);275 sprintf(device_path, devices[selected_box].ca_device_path, demux[index_demux].cadev_index+ca_offset); 270 276 } 271 277 … … 273 279 if (type==1 && errno==16) // ca device already open 274 280 for (i=0;i<MAX_DEMUX;i++) 275 if (demux[i]. demux_index==demux[index_demux].demux_index && demux[i].ca_fd>0)281 if (demux[i].cadev_index==demux[index_demux].cadev_index && demux[i].ca_fd>0) 276 282 dmx_fd=demux[i].ca_fd; 277 283 278 284 if (dmx_fd<=0) 279 cs_ log("dvbapi: error opening device %s (Errno: %d)", device_path, errno);285 cs_debug("dvbapi: error opening device %s (Errno: %d)", device_path, errno); 280 286 } 281 287 … … 298 304 } 299 305 300 unsigned short dvbapi_get_provid(int demux_index, int pid)306 unsigned long dvbapi_get_provid(int demux_index, unsigned short pid) 301 307 { 302 308 unsigned char buf[BUFSIZE]; … … 310 316 311 317 if (len > 0) { 312 short intprovid = (buf[10] << 8) | buf[11];318 unsigned long provid = (buf[10] << 8) | buf[11]; 313 319 return provid; 314 320 } … … 317 323 } 318 324 319 unsigned short dvbapi_get_single_ecm(int demux_index, int caid, int pid, unsigned shortprovid)325 unsigned short dvbapi_get_single_ecm(int demux_index, unsigned short caid, unsigned short pid, unsigned long provid) 320 326 { 321 327 unsigned char buf[BUFSIZE]; … … 454 460 void dvbapi_stop_descrambling_all(int demux_index) 455 461 { 456 int i,j;462 int j; 457 463 for (j=0;j<MAX_DEMUX;j++) { 458 464 if (demux[j].demux_index != demux_index) … … 465 471 } 466 472 467 void dvbapi_start_descrambling(int demux_index, int caid, int capid, unsigned shortprovider_id)473 void dvbapi_start_descrambling(int demux_index, unsigned short caid, unsigned short capid, unsigned long provider_id) 468 474 { 469 475 int i; … … 531 537 532 538 //grep ecm 533 dvbapi_get_single_ecm(demux_index, demux[demux_index].ECMpids[n].CA_System_ID, demux[demux_index].ECMpids[n].CA_PID, provid);539 dvbapi_get_single_ecm(demux_index, demux[demux_index].ECMpids[n].CA_System_ID, demux[demux_index].ECMpids[n].CA_PID, provid); 534 540 535 541 sleep(3); //try next if no cw for .. secs … … 569 575 n=0; 570 576 k++; 577 continue; 571 578 } 572 579 n++; … … 575 582 return 0; 576 583 577 sleep(1 );584 sleep(10); 578 585 } 579 586 … … 617 624 continue; 618 625 619 if (buffer[0] == 0x80 | buffer[0] == 0x81)626 if (buffer[0] == 0x80 || buffer[0] == 0x81) 620 627 { 621 628 if (memcmp(buffer, demux[demux_index].buffer_cache_dmx, 12) != 0) { … … 677 684 } 678 685 686 int dvbapi_check_array(unsigned short *array, int len, unsigned short match) 687 { 688 int i; 689 for (i=0; i<len; i++) { 690 if (array[i]==match) { 691 return 1; 692 } 693 } 694 return 0; 695 } 696 697 void dvbapi_resort_ecmpids(int demux_index) 698 { 699 ECMPIDSTYPE tmppids[ECM_PIDS]; 700 ECMPIDSTYPE tmppids2[ECM_PIDS]; 701 702 int tmppidcount=0,tmppid2count=0,n; 703 704 int i,k,j; 705 706 for (i=0;i<MAX_CAID;i++) 707 global_caid_list[i]=0; 708 709 k=0; 710 for (i=0;i<CS_MAXREADER;i++) { 711 for (j=0;j<16;j++) { 712 if (reader[i].caid[j] != 0) { 713 if (k+1>=MAX_CAID) break; 714 global_caid_list[k]=reader[i].caid[j]; 715 k++; 716 717 } 718 } 719 } 720 for (n=0; n<demux[demux_index].ECMpidcount; n++) { 721 if (dvbapi_check_array(ignoretab, TAB_SIZE, demux[demux_index].ECMpids[n].CA_System_ID)) { 722 cs_debug("-> ignore %04x", demux[demux_index].ECMpids[n].CA_System_ID); 723 } else if (dvbapi_check_array(global_caid_list, MAX_CAID, demux[demux_index].ECMpids[n].CA_System_ID)) { 724 cs_debug("-> caid list %04x", demux[demux_index].ECMpids[n].CA_System_ID); 725 tmppids[tmppidcount]=demux[demux_index].ECMpids[n]; 726 tmppidcount++; 727 } else if (dvbapi_check_array(prioritytab, TAB_SIZE, demux[demux_index].ECMpids[n].CA_System_ID)) { 728 cs_debug("-> priority %04x", demux[demux_index].ECMpids[n].CA_System_ID); 729 tmppids[tmppidcount]=demux[demux_index].ECMpids[n]; 730 tmppidcount++; 731 } else { 732 tmppids2[tmppid2count]=demux[demux_index].ECMpids[n]; 733 tmppid2count++; 734 } 735 } 736 737 for (n=0;n<tmppid2count;n++) { 738 tmppids[tmppidcount]=tmppids2[n]; 739 tmppidcount++; 740 } 741 742 for (n=0; n<tmppidcount; n++) { 743 demux[demux_index].ECMpids[n]=tmppids[n]; 744 } 745 746 demux[demux_index].ECMpidcount=tmppidcount; 747 cs_debug("dvbapi: ECMpidscount is now %d", demux[demux_index].ECMpidcount); 748 749 return; 750 } 751 679 752 // from tuxbox camd 680 753 int dvbapi_parse_capmt(unsigned char *buffer, unsigned int length) 681 754 { 682 int i, j, u ;683 int n, added, ca_mask=1, demux_index2=0;755 int i, j, u, n, added; 756 int ca_mask=0x01, demux_index2=0x00; 684 757 685 758 int ca_pmt_list_management = buffer[0]; 686 759 unsigned int program_number = (buffer[1] << 8) | buffer[2]; 687 unsignedint program_info_length = ((buffer[4] & 0x0F) << 8) | buffer[5];760 int program_info_length = ((buffer[4] & 0x0F) << 8) | buffer[5]; 688 761 689 762 switch (ca_pmt_list_management) … … 711 784 dvbapi_stop_descrambling_all(0); 712 785 } 713 714 786 715 787 for (i=0;i<MAX_DEMUX;i++) { … … 741 813 } 742 814 743 cs_debug("dvbapi: got id %d", demux_id);744 745 815 if (demux_id<0) { 746 816 cs_log("dvbapi: error no free id (MAX_DEMUX)"); 747 return ;817 return 0; 748 818 } 749 819 … … 757 827 demux[demux_id].STREAMpidcount=0; 758 828 demux[demux_id].active=1; 759 760 cs_debug("dvbapi: demux index %d", demux[demux_id].demux_index); 829 demux[demux_id].cadev_index=demux_index2; 830 831 for (i=0;i<8;i++) { 832 if (ca_mask & (1 << i)) { 833 demux[demux_id].cadev_index=i; 834 break; 835 } 836 } 837 838 cs_debug("dvbapi: demux index: %d ca index: %d", demux[demux_id].demux_index, demux[demux_id].cadev_index); 761 839 762 840 //CA_PIDS for all streams … … 800 878 int ca_pmt_cmd_id = buffer[i + 5]; 801 879 cs_debug("dvbapi: ca_pmt_cmd_id 0x%02x", ca_pmt_cmd_id); 802 int descriptor_length=0;880 unsigned int descriptor_length=0; 803 881 for (j = 0; j < es_info_length - 1; j += descriptor_length + 2) 804 882 { … … 832 910 833 911 if (demux[demux_id].ECMpidcount>0) { 834 pthread_create (&p3, NULL, thread_descrambling, (void *)demux_id); 912 dvbapi_resort_ecmpids(demux_id); 913 if (demux[demux_id].ECMpidcount>0) 914 pthread_create (&p3, NULL, thread_descrambling, (void *)demux_id); 835 915 } 836 916 … … 842 922 void dvbapi_handlesockmsg (unsigned char *buffer, ssize_t len) 843 923 { 844 int i; 845 unsigned int val, size; 924 unsigned int val, size, i; 846 925 847 926 //cs_dump(buffer, len, "handlesockmsg:"); … … 872 951 if ((3 + size + val) == len) 873 952 dvbapi_parse_capmt(buffer + 3 + size, val); 874 else 953 else { 875 954 cs_log("dvbapi: ca_pmt invalid length"); 955 cs_dump(buffer, len, "invalid length:"); 956 } 876 957 break; 877 958 case 0x3f: … … 1010 1091 } 1011 1092 1093 char *ptr1, *ptr3; 1094 //priority 1095 for (i=0, ptr1=strtok(cfg->dvbapi_priority, ","); (i<20) && (ptr1); ptr1=strtok(NULL, ",")) 1096 { 1097 unsigned long caid, prov; 1098 if( (ptr3=strchr(trim(ptr1), ':')) ) 1099 *ptr3++='\0'; 1100 else 1101 ptr3=""; 1102 1103 if (((caid=a2i(ptr1, 2))|(prov=a2i(ptr3, 3))) < 0x10000) 1104 { 1105 prioritytab[i]=caid; 1106 i++; 1107 } 1108 } 1109 //ignore 1110 for (i=0, ptr1=strtok(cfg->dvbapi_ignore, ","); (i<20) && (ptr1); ptr1=strtok(NULL, ",")) 1111 { 1112 unsigned long caid, prov; 1113 if( (ptr3=strchr(trim(ptr1), ':')) ) 1114 *ptr3++='\0'; 1115 else 1116 ptr3=""; 1117 1118 if (((caid=a2i(ptr1, 2))|(prov=a2i(ptr3, 3))) < 0x10000) 1119 { 1120 ignoretab[i]=caid; 1121 i++; 1122 } 1123 } 1012 1124 1013 1125 pfd2[0].fd = fd_m2c; … … 1051 1163 memcpy(cw_0, er->cw, 8); 1052 1164 memcpy(cw_1, er->cw+8, 8); 1053 1054 int cam_fd=0;1055 1165 1056 1166 for (i=0;i<MAX_DEMUX;i++)
Note:
See TracChangeset
for help on using the changeset viewer.