Changeset 3788 for trunk/module-dvbapi.c
- Timestamp:
- 10/31/10 16:21:44 (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-dvbapi.c
r3768 r3788 5 5 #include "module-dvbapi.h" 6 6 7 #ifdef AZBOX 8 #include "openxcas/openxcas_api.h" 7 #ifdef AZBOX 8 #include "openxcas/openxcas_api.h" 9 9 #include "openxcas/openxcas_message.h" 10 10 … … 41 41 #ifdef AZBOX 42 42 openxcas_caid = demux[demux_id].ECMpids[pidindex].CAID; 43 openxcas_ecm_pid = pid; 44 45 return 1; 43 openxcas_ecm_pid = pid; 44 45 return 1; 46 46 #endif 47 47 int ret=-1,n=-1,i; … … 59 59 demux[demux_id].demux_fd[n].type = type; 60 60 demux[demux_id].demux_fd[n].count = count; 61 61 62 62 switch(api) { 63 63 case DVBAPI_3: … … 206 206 if (cfg->dvbapi_boxtype==BOXTYPE_DUCKBOX || cfg->dvbapi_boxtype==BOXTYPE_DBOX2 || cfg->dvbapi_boxtype==BOXTYPE_UFS910) 207 207 ca_offset=1; 208 208 209 209 if (cfg->dvbapi_boxtype==BOXTYPE_QBOXHD) 210 210 num=0; 211 211 212 212 sprintf(device_path2, devices[selected_box].ca_device, num+ca_offset); 213 213 sprintf(device_path, devices[selected_box].path, adapter); … … 229 229 230 230 for (g=0;g<MAX_FILTER;g++) { 231 if (demux[demux_index].demux_fd[g].type==type) { 231 if (demux[demux_index].demux_fd[g].type==type) { 232 232 dvbapi_stop_filternum(demux_index, g); 233 233 } … … 242 242 #ifdef WITH_STAPI 243 243 ret=stapi_remove_filter(demux_index, num); 244 #else 244 #else 245 245 ret=ioctl(demux[demux_index].demux_fd[num].fd,DMX_STOP); 246 246 close(demux[demux_index].demux_fd[num].fd); … … 278 278 if (memcmp(demux[demux_index].rdr->hexserial, demux[demux_index].hexserial, 8)) 279 279 dvbapi_stop_filter(demux_index, TYPE_EMM); 280 280 281 281 if (demux[demux_index].rdr->card_system==0) 282 282 demux[demux_index].rdr->card_system=get_cardsystem(demux[demux_index].ECMpids[demux[demux_index].pidindex].CAID); … … 323 323 } 324 324 } 325 325 326 326 if (added==0) { 327 327 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].ECM_PID = ecmpid; … … 343 343 cs_debug("[ADD EMMPID %d] CAID: %04X\tEMM_PID: %04X\tPROVID: %06X", j, caid, emmpid, provid); 344 344 } 345 } 345 } 346 346 } 347 347 … … 415 415 416 416 switch(selected_api) { 417 #ifdef WITH_STAPI 417 #ifdef WITH_STAPI 418 418 case STAPI: 419 419 stapi_set_pid(demux_id,num,index); … … 448 448 449 449 cs_debug("stop descrambling (demux_id: %d)", demux_id); 450 450 451 451 dvbapi_stop_filter(demux_id, TYPE_ECM); 452 452 dvbapi_stop_filter(demux_id, TYPE_EMM); … … 471 471 472 472 for (j=0; j<demux[demux_id].ECMpidcount; j++) { 473 if (demux[demux_id].curindex == j || (demux[demux_id].ECMpids[demux[demux_id].curindex].CAID == demux[demux_id].ECMpids[j].CAID 474 && demux[demux_id].ECMpids[demux[demux_id].curindex].PROVID == demux[demux_id].ECMpids[j].PROVID 473 if (demux[demux_id].curindex == j || (demux[demux_id].ECMpids[demux[demux_id].curindex].CAID == demux[demux_id].ECMpids[j].CAID 474 && demux[demux_id].ECMpids[demux[demux_id].curindex].PROVID == demux[demux_id].ECMpids[j].PROVID 475 475 && demux[demux_id].ECMpids[j].PROVID > 0)) { 476 476 … … 494 494 495 495 cs_log("Start descrambling PID #%d (CAID: %04X) %d", demux[demux_id].curindex, demux[demux_id].ECMpids[demux[demux_id].curindex].CAID, streamcount); 496 496 497 497 if (cfg->dvbapi_au==1) 498 498 dvbapi_start_filter(demux_id, demux[demux_id].pidindex, 0x001, 0x01, 0xFF, 0, TYPE_EMM); //CAT … … 504 504 void dvbapi_process_emm (int demux_index, int filter_num, unsigned char *buffer, unsigned int len) { 505 505 EMM_PACKET epg; 506 506 507 507 if (demux[demux_index].pidindex==-1) return; 508 508 … … 512 512 switch (caid >> 8) { 513 513 case 0x05: 514 #ifdef READER_VIACCESS 514 515 if (!viaccess_reassemble_emm(buffer, &len)) 516 #endif 515 517 return; 516 518 break; 517 case 0x0d: 519 case 0x0d: 520 #ifdef READER_CRYPTOWORKS 518 521 if (!cryptoworks_reassemble_emm(buffer, &len)) 522 #endif 519 523 return; 520 524 break; 521 525 } 522 526 523 527 524 528 cs_ddump(buffer, len, "emm from fd %d:", demux[demux_index].demux_fd[filter_num].fd); … … 552 556 snprintf(token, 127, "%s%s", cs_confdir, cs_prio); 553 557 fp=fopen(token, "r"); 554 558 555 559 if (!fp) { 556 560 cs_log("can't open priority file %s", token); … … 561 565 if (token[0]=='#' || token[0]=='/') continue; 562 566 if (strlen(token)>100) continue; 563 567 564 568 memset(str1, 0, 128); 565 569 … … 626 630 entry2->srvid=this->srvid; 627 631 628 cs_debug("prio srvid: ret=%d | %c: %04X %06X %04X %04X %04X -> map %04X %06X | prio %d | delay %d", 632 cs_debug("prio srvid: ret=%d | %c: %04X %06X %04X %04X %04X -> map %04X %06X | prio %d | delay %d", 629 633 ret, entry2->type, entry2->caid, entry2->provid, entry2->srvid, entry2->ecmpid, entry2->chid, entry2->mapcaid, entry2->mapprovid, entry2->force, entry2->delay); 630 634 … … 645 649 } 646 650 647 cs_debug("prio: ret=%d | %c: %04X %06X %04X %04X %04X -> map %04X %06X | prio %d | delay %d", 651 cs_debug("prio: ret=%d | %c: %04X %06X %04X %04X %04X -> map %04X %06X | prio %d | delay %d", 648 652 ret, entry->type, entry->caid, entry->provid, entry->srvid, entry->ecmpid, entry->chid, entry->mapcaid, entry->mapprovid, entry->force, entry->delay); 649 653 … … 732 736 } 733 737 } 734 } 738 } 735 739 } 736 740 … … 767 771 768 772 if (descriptor_ca_system_id >> 8 == 0x01) { 769 for (u=2; u<descriptor_length; u+=15) { 773 for (u=2; u<descriptor_length; u+=15) { 770 774 descriptor_ca_pid = ((buffer[j+2+u] & 0x1F) << 8) | buffer[j+2+u+1]; 771 775 descriptor_ca_provider = (buffer[j+2+u+2] << 8) | buffer[j+2+u+3]; … … 781 785 if (descriptor_ca_system_id >> 8 == 0x4A && descriptor_length == 0x05) 782 786 descriptor_ca_provider = buffer[j+6]; 783 787 784 788 dvbapi_add_ecmpid(demux_id, descriptor_ca_system_id, descriptor_ca_pid, descriptor_ca_provider); 785 789 } … … 820 824 start=0; 821 825 end=0; 822 } 826 } 823 827 824 828 if (num == -1) { … … 863 867 864 868 cs_ddump(buffer, length, "capmt:"); 865 869 866 870 for (i = 0; i < MAX_DEMUX; i++) { 867 871 if (connfd>0 && demux[i].socket_fd == connfd) { … … 883 887 return -1; 884 888 } 885 889 886 890 if (cfg->dvbapi_boxtype == BOXTYPE_IPBOX_PMT) { 887 891 ca_mask = demux_id + 1; … … 927 931 928 932 if (es_info_length != 0 && es_info_length < length) { 929 dvbapi_parse_descriptor(demux_id, es_info_length, buffer+i+5); 933 dvbapi_parse_descriptor(demux_id, es_info_length, buffer+i+5); 930 934 } 931 935 } … … 993 997 dvbapi_stop_descrambling(i); 994 998 break; 995 } 996 } 999 } 1000 } 997 1001 // check do we have any demux running on this fd 998 1002 short execlose = 1; … … 1033 1037 if (listen(listenfd, 5) < 0) 1034 1038 return 0; 1035 // change the access right on the camd.socket 1039 // change the access right on the camd.socket 1036 1040 // this will allow oscam to run as root if needed 1037 1041 // and still allow non root client to connect to the socket 1038 1042 1039 1043 chmod(devices[selected_box].cam_socket_path, S_IRWXU | S_IRWXG | S_IRWXO); 1040 1044 1041 1045 return listenfd; 1042 1046 } … … 1053 1057 ptr3=""; 1054 1058 1055 if (((caid=a2i(ptr1, 2))|(prov=a2i(ptr3, 3)))) { 1059 if (((caid=a2i(ptr1, 2))|(prov=a2i(ptr3, 3)))) { 1056 1060 struct s_dvbapi_priority *entry = malloc(sizeof(struct s_dvbapi_priority)); 1057 1061 memset(entry, 0, sizeof(struct s_dvbapi_priority)); … … 1065 1069 } else 1066 1070 entry->provid=prov; 1067 1071 1068 1072 entry->type=type; 1069 1073 … … 1096 1100 signal=signal; //avoid compiler warnings 1097 1101 pthread_mutex_lock(&event_handler_lock); 1098 1102 1099 1103 int standby_fd = open(STANDBY_FILE, O_RDONLY); 1100 1104 pausecam = (standby_fd > 0) ? 1 : 0; … … 1102 1106 1103 1107 if (cfg->dvbapi_boxtype==BOXTYPE_IPBOX || cfg->dvbapi_pmtmode == 1) { 1104 pthread_mutex_unlock(&event_handler_lock); 1108 pthread_mutex_unlock(&event_handler_lock); 1105 1109 return; 1106 1110 } … … 1131 1135 1132 1136 if (disable_pmt_files) { 1133 pthread_mutex_unlock(&event_handler_lock); 1134 return; 1137 pthread_mutex_unlock(&event_handler_lock); 1138 return; 1135 1139 } 1136 1140 … … 1138 1142 if (!dirp) { 1139 1143 cs_log("opendir errno %d", errno); 1140 pthread_mutex_unlock(&event_handler_lock); 1144 pthread_mutex_unlock(&event_handler_lock); 1141 1145 return; 1142 1146 } 1143 1147 1144 1148 while ((dp = readdir(dirp))) { 1145 1149 if (strlen(dp->d_name) < 7) 1146 continue; 1147 if (strncmp(dp->d_name, "pmt", 3)!=0 || strncmp(dp->d_name+strlen(dp->d_name)-4, ".tmp", 4)!=0) 1150 continue; 1151 if (strncmp(dp->d_name, "pmt", 3)!=0 || strncmp(dp->d_name+strlen(dp->d_name)-4, ".tmp", 4)!=0) 1148 1152 continue; 1149 1153 1150 1154 sprintf(dest, "%s%s", TMPDIR, dp->d_name); 1151 1155 pmt_fd = open(dest, O_RDONLY); 1152 if (pmt_fd < 0) 1156 if (pmt_fd < 0) 1153 1157 continue; 1154 1155 if (fstat(pmt_fd, &pmt_info) != 0) 1158 1159 if (fstat(pmt_fd, &pmt_info) != 0) 1156 1160 { close(pmt_fd); continue; } 1157 1161 1158 1162 int found=0; 1159 1163 for (i=0;i<MAX_DEMUX;i++) { … … 1168 1172 if (found) 1169 1173 { close(pmt_fd); continue; } 1170 1174 1171 1175 cs_log("found pmt file %s", dest); 1172 1176 cs_sleepms(100); … … 1174 1178 unsigned int len = read(pmt_fd,mbuf,sizeof(mbuf)); 1175 1179 close(pmt_fd); 1176 1180 1177 1181 if (len < 1) { 1178 1182 cs_log("pmt file %s have invalid len!", dest); … … 1193 1197 if (sscanf((char*)mbuf+j2, "%02X", dest+j1) != 1) { 1194 1198 cs_log("error parsing QboxHD pmt.tmp, data not valid in position %d",j2); 1195 pthread_mutex_unlock(&event_handler_lock); 1199 pthread_mutex_unlock(&event_handler_lock); 1196 1200 return; 1197 1201 } … … 1199 1203 1200 1204 cs_ddump(dest,len/2,"QboxHD pmt.tmp:"); 1201 1205 1202 1206 pmt_id = dvbapi_parse_capmt(dest+4, (len/2)-4, -1); 1203 1207 #else 1204 if (len>sizeof(dest)) { 1208 if (len>sizeof(dest)) { 1205 1209 cs_log("event_handler() dest buffer is to small for pmt data!"); 1206 1210 continue; … … 1227 1231 } 1228 1232 closedir(dirp); 1229 pthread_mutex_unlock(&event_handler_lock); 1233 pthread_mutex_unlock(&event_handler_lock); 1230 1234 } 1231 1235 … … 1237 1241 return; 1238 1242 1239 if (buffer[0] != 0x80 && buffer[0] != 0x81) 1243 if (buffer[0] != 0x80 && buffer[0] != 0x81) 1240 1244 return; 1241 1245 1242 1246 unsigned short caid = curpid->CAID; 1243 1247 unsigned long provid = curpid->PROVID; 1244 1248 1245 1249 if ((caid >> 8) == 0x06) { 1246 1250 //80 70 39 53 04 05 00 88 … … 1270 1274 if (curpid->table == buffer[0]) 1271 1275 return; 1272 1276 1273 1277 curpid->table = buffer[0]; 1274 1278 … … 1310 1314 cs_debug("receiving cat"); 1311 1315 dvbapi_parse_cat(demux_id, buffer, len); 1312 1316 1313 1317 dvbapi_stop_filternum(demux_id, filter_num); 1314 1318 return; … … 1386 1390 pthread_mutexattr_init(&attr); 1387 1391 pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); 1388 pthread_mutex_init(&event_handler_lock, &attr); 1389 1392 pthread_mutex_init(&event_handler_lock, &attr); 1393 1390 1394 dir_fd = open(TMPDIR, O_RDONLY); 1391 1395 if (dir_fd >= 0) { … … 1407 1411 1408 1412 while (1) { 1409 pfdcount = (listenfd > -1) ? 2 : 1; 1413 pfdcount = (listenfd > -1) ? 2 : 1; 1410 1414 1411 1415 chk_pending(tp); … … 1426 1430 } 1427 1431 } 1428 1432 1429 1433 if (demux[i].socket_fd>0) { 1430 1434 rc=0; … … 1452 1456 if (pfd2[i].revents > 3) 1453 1457 cs_debug("event %d on fd %d", pfd2[i].revents, pfd2[i].fd); 1454 1458 1455 1459 if (pfd2[i].revents & (POLLHUP | POLLNVAL)) { 1456 1460 if (type[i]==1) { … … 1594 1598 } 1595 1599 } 1596 1600 1597 1601 int j=0; 1598 1602 for (j=0; j<demux[i].ECMpidcount; j++) … … 1650 1654 #ifdef AZBOX 1651 1655 void azbox_openxcas_ecm_callback(int stream_id, unsigned int seq, int cipher_index, unsigned int caid, unsigned char *ecm_data, int l, unsigned short pid) { 1652 cs_debug("openxcas: ecm callback received"); 1656 cs_debug("openxcas: ecm callback received"); 1653 1657 1654 1658 openxcas_stream_id = stream_id; … … 1702 1706 } 1703 1707 }*/ 1704 } 1705 1708 } 1709 1706 1710 1707 1711 void azbox_openxcas_ex_callback(int stream_id, unsigned int seq, int idx, unsigned int pid, unsigned char *ecm_data, int l) { … … 1726 1730 cs_debug("request cw for caid %04X provid %06X srvid %04X pid %04X", er->caid, er->prid, er->srvid, er->pid); 1727 1731 get_cw(dvbapi_client, er); 1728 1732 1729 1733 if (openxcas_stop_filter_ex(stream_id, seq, openxcas_filter_idx) < 0) 1730 1734 cs_log("openxcas: unable to stop ex filter"); 1731 1735 else 1732 1736 cs_debug("openxcas: ex filter stopped"); 1733 1737 1734 1738 struct timeb tp; 1735 1739 cs_ftime(&tp); … … 1795 1799 cs_log("openxcas: channel change: sid = %x, vpid = %x. apid = %x", chan.service_id, chan.v_pid, chan.a_pid); 1796 1800 1797 openxcas_video_pid = chan.v_pid; 1801 openxcas_video_pid = chan.v_pid; 1798 1802 openxcas_audio_pid = chan.a_pid; 1799 1803 openxcas_data_pid = chan.d_pid; 1800 1804 break; 1801 case OPENXCAS_START_PMT_ECM: 1805 case OPENXCAS_START_PMT_ECM: 1802 1806 cs_debug("openxcas: msg: OPENXCAS_START_PMT_ECM"); 1803 1807 … … 1826 1830 if ((ret = openxcas_add_filter(msg.stream_id, OPENXCAS_FILTER_ECM, 0, 0xffff, openxcas_ecm_pid, mask, comp, (void *)azbox_openxcas_ecm_callback)) < 0) 1827 1831 cs_log("openxcas: unable to add ecm filter"); 1828 else 1832 else 1829 1833 cs_debug("openxcas: ecm filter added, pid = %x, caid = %x", openxcas_ecm_pid, 0); 1830 1834 … … 1911 1915 if (openxcas_start_filter(openxcas_stream_id, openxcas_seq, OPENXCAS_FILTER_ECM) < 0) 1912 1916 cs_log("openxcas: unable to start ecm filter"); 1913 else 1917 else 1914 1918 cs_debug("openxcas: ecm filter started"); 1915 1919 … … 1928 1932 } 1929 1933 } 1930 1934 1931 1935 if (openxcas_set_key(openxcas_stream_id, openxcas_seq, 0, openxcas_cipher_idx, openxcas_cw, openxcas_cw + 8) != 1) 1932 1936 cs_log("openxcas: set cw failed");
Note:
See TracChangeset
for help on using the changeset viewer.