Changeset 1115
- Timestamp:
- 01/07/10 19:49:09 (14 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Distribution/doc/man/oscam.1
r1080 r1115 37 37 .TP 3n 38 38 \(bu 39 DVB API 3 support with AUsupport39 DVB API with AU, multi tuner and PIP support 40 40 .TP 3n 41 41 OSCam works on the following plattforms: -
trunk/Distribution/doc/man/oscam.conf.5
r1111 r1115 330 330 example: locals = 01001234,02005678 331 331 .RE 332 .SS "The [dvbapi] section" \fI(only if DVB API 3module enabled)\fR332 .SS "The [dvbapi] section" \fI(only if DVB API module enabled)\fR 333 333 .PP 334 334 \fBenabled\fP = \fB0\fP|\fB1\fP 335 335 .RS 3n 336 1 = DVB API 3enabled, default:0336 1 = DVB API enabled, default:0 337 337 .RE 338 338 .PP 339 339 \fBuser\fP = \fBusername\fP 340 340 .RS 3n 341 user name for DVB API 3client, default:anonymous341 user name for DVB API client, default:anonymous 342 342 .RE 343 343 .PP … … 349 349 \fBboxtype\fP = \fBdbox2\fP|\fBdreambox\fP|\fBufs910\fP 350 350 .RS 3n 351 set boxtype, default:dreambox351 set boxtype, auto detection of DVB API will be aspired, default:dreambox 352 352 .RE 353 353 .SS "The [anticasc] section" \fI(only if anti-cascading enabled)\fR -
trunk/Distribution/doc/txt/oscam.conf.txt
r1111 r1115 239 239 example: locals = 01001234,02005678 240 240 241 The [dvbapi] section (only if DVB API 3module enabled)241 The [dvbapi] section (only if DVB API module enabled) 242 242 enabled = 0|1 243 1 = DVB API 3enabled, default:0243 1 = DVB API enabled, default:0 244 244 245 245 user = username 246 user name for DVB API 3client, default:anonymous246 user name for DVB API client, default:anonymous 247 247 248 248 au = 0|1 … … 250 250 251 251 boxtype = dbox2|dreambox|ufs910 252 set boxtype, default:dreambox 252 set boxtype, auto detection of DVB API will be aspired, 253 default:dreambox 253 254 254 255 The [anticasc] section (only if anti-cascading enabled) … … 257 258 258 259 numusers = quantity 259 anti-cascading: user per account, 0 = anti-cascading notpermitted,260 anti-cascading: user per account, 0 = anti-cascading not permitted, 260 261 default:0 261 262 … … 340 341 341 342 SEE ALSO 342 oscam(1), oscam.user(5), oscam.server(5),oscam.srvid(5),343 oscam.guess(5), oscam.cert(5), oscam.services(5), oscam.ird(5),343 oscam(1), oscam.user(5), oscam.server(5), oscam.srvid(5), 344 oscam.guess(5), oscam.cert(5), oscam.services(5), oscam.ird(5), 344 345 oscam.ac(5) 345 346 -
trunk/Distribution/doc/txt/oscam.txt
r1080 r1115 33 33 CCcam with AU support, cascading/remote server ECM support 34 34 35 DVB API 3 support with AUsupport35 DVB API with AU, multi tuner and PIP support 36 36 37 37 OSCam works on the following plattforms: -
trunk/README
r1014 r1115 30 30 CS_ANTICASC - enable anti-cascading 31 31 CS_LOGHISTORY - enable log history 32 HAVE_DVBAPI _3 - enable DVB API 3support32 HAVE_DVBAPI - enable DVB API support 33 33 34 34 -
trunk/globals.h
r1093 r1115 569 569 unsigned long locals[CS_MAXLOCALS]; 570 570 //struct s_irdeto_quess *itab[0xff]; 571 #ifdef HAVE_DVBAPI _3571 #ifdef HAVE_DVBAPI 572 572 int dvbapi_enabled; 573 573 int dvbapi_au; … … 862 862 extern void module_gbox(struct s_module *); 863 863 extern void module_cccam(struct s_module *); 864 #ifdef HAVE_DVBAPI _3864 #ifdef HAVE_DVBAPI 865 865 extern void module_dvbapi(struct s_module *); 866 866 #endif -
trunk/module-dvbapi.c
r1111 r1115 17 17 */ 18 18 19 #ifdef HAVE_DVBAPI _319 #ifdef HAVE_DVBAPI 20 20 21 21 #include <errno.h> … … 33 33 #include "globals.h" 34 34 35 #include <linux/dvb/ca.h> 36 #include <linux/dvb/dmx.h> 37 38 #define CADEV "/dev/dvb/adapter0/ca%d" 39 #define DMXDEV "/dev/dvb/adapter0/demux%d" 40 #define CAMDSOCKET "/tmp/camd.socket" 41 42 #define BUFSIZE 1024 43 #define MAX_CAID 50 44 #define MAX_DEMUX 3 35 #define BUFSIZE 1024 36 #define MAX_DEMUX 5 45 37 46 38 static int listenfd = -1; … … 55 47 typedef struct demux_s 56 48 { 49 int demux_index; 57 50 int demux_ecm_fd; 58 51 int demux_emm_fd; 59 52 int cadev_index; 60 53 int ca_fd; 61 unsigned short int program_number; 62 short emm_pid; 54 int active; 63 55 int ECMpidcount; 64 56 ECMPIDSTYPE ECMpids[20]; 65 int ca_system_id; 66 int ca_pid; 67 int provider_id; 68 int received_emm; 57 unsigned int program_number; 58 unsigned int ca_system_id; 59 unsigned int ca_pid; 60 unsigned int provider_id; 61 unsigned int emm_pid; 69 62 int STREAMpidcount; 70 63 short STREAMpids[20]; … … 73 66 unsigned char lastcw1[8]; 74 67 } DEMUXTYPE; 75 76 typedef struct demux_search_s 77 { 78 int type; 79 int index; 80 } demux_search; 68 #define DMX_FILTER_SIZE 16 69 70 //dvbapi 1 71 typedef struct dmxFilter 72 { 73 uint8_t filter[DMX_FILTER_SIZE]; 74 uint8_t mask[DMX_FILTER_SIZE]; 75 } dmxFilter_t; 76 77 struct dmxSctFilterParams 78 { 79 uint16_t pid; 80 dmxFilter_t filter; 81 uint32_t timeout; 82 uint32_t flags; 83 #define DMX_CHECK_CRC 1 84 #define DMX_ONESHOT 2 85 #define DMX_IMMEDIATE_START 4 86 #define DMX_BUCKET 0x1000 /* added in 2005.05.18 */ 87 #define DMX_KERNEL_CLIENT 0x8000 88 }; 89 90 #define DMX_START1 _IOW('o',41,int) 91 #define DMX_STOP1 _IOW('o',42,int) 92 #define DMX_SET_FILTER1 _IOW('o',43,struct dmxSctFilterParams *) 93 94 95 //dbox2+ufs 96 typedef struct dmx_filter 97 { 98 uint8_t filter[DMX_FILTER_SIZE]; 99 uint8_t mask[DMX_FILTER_SIZE]; 100 uint8_t mode[DMX_FILTER_SIZE]; 101 } dmx_filter_t; 102 103 104 struct dmx_sct_filter_params 105 { 106 uint16_t pid; 107 dmx_filter_t filter; 108 uint32_t timeout; 109 uint32_t flags; 110 #define DMX_CHECK_CRC 1 111 #define DMX_ONESHOT 2 112 #define DMX_IMMEDIATE_START 4 113 #define DMX_KERNEL_CLIENT 0x8000 114 }; 115 116 typedef struct ca_descr { 117 unsigned int index; 118 unsigned int parity; /* 0 == even, 1 == odd */ 119 unsigned char cw[8]; 120 } ca_descr_t; 121 122 typedef struct ca_pid { 123 unsigned int pid; 124 int index; /* -1 == disable*/ 125 } ca_pid_t; 126 127 #define DMX_START _IO('o', 41) 128 #define DMX_STOP _IO('o', 42) 129 #define DMX_SET_FILTER _IOW('o', 43, struct dmx_sct_filter_params) 130 131 #define CA_SET_DESCR _IOW('o', 134, ca_descr_t) 132 #define CA_SET_PID _IOW('o', 135, ca_pid_t) 81 133 82 134 DEMUXTYPE demux[MAX_DEMUX]; 135 136 #define BOX_COUNT 2 137 struct box_devices 138 { 139 char ca_device_path[32]; 140 char demux_device_path[32]; 141 char cam_socket_path[32]; 142 }; 143 144 struct box_devices devices[BOX_COUNT] = { 145 /* dreambox (dvb-api-3)*/ { "/dev/dvb/adapter0/ca%d", "/dev/dvb/adapter0/demux%d", "/var/tmp/camd.socket" }, 146 /* dreambox (dvb-api-1)*/ { "/dev/dvb/card0/ca%d", "/dev/dvb/card0/demux%d", "/var/tmp/camd.socket" } 147 }; 148 149 int selected_box=-1; 150 int selected_api=-1; 151 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; 155 156 cs_debug("dvbapi: set filter pid:%04x, value:%04x",pid, filt); 157 158 switch(api) 159 { 160 case 0: 161 //dvbapi 1 162 command=0; 163 struct dmxSctFilterParams sFP1; 164 165 memset(&sFP1,0,sizeof(sFP1)); 166 167 sFP1.pid = pid; 168 sFP1.timeout = timeout; 169 sFP1.flags = DMX_IMMEDIATE_START; 170 sFP1.filter.filter[0] = filt; 171 sFP1.filter.mask[0] = mask; 172 ret=ioctl(dmx_fd, DMX_SET_FILTER1, &sFP1); 173 174 break; 175 case 1: 176 //dvbapi 3 177 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 default: 191 break; 192 } 193 194 if (ret < 0) 195 cs_log("dvbapi: could not start demux filter (Errno: %d)", errno); 196 197 return ret; 198 } 199 200 201 int dvbapi_detect_api() 202 { 203 int num_apis=2; 204 int i,devnum=-1; 205 int apinum=-1; 206 int dmx_fd=0; 207 208 char device_path[128]; 209 210 for (i=0;i<BOX_COUNT;i++) 211 { 212 sprintf(device_path, devices[i].demux_device_path, 0); 213 if ((dmx_fd = open(device_path, O_RDWR)) > 0) { 214 devnum=i; 215 break; 216 } 217 } 218 219 if (dmx_fd < 0) return 0; 220 221 int command,ret=0; 222 223 for (i=0;i<num_apis;i++) 224 { 225 ret=dvbapi_set_filter(dmx_fd, i, 0x0001, 0x01, 0xFF, 1); 226 227 if (ret >= 0) 228 { 229 apinum=i; 230 break; 231 } 232 } 233 close(dmx_fd); 234 235 selected_box=devnum; 236 selected_api=apinum; 237 cs_log("Detect %s Api: %d", devices[devnum].demux_device_path, apinum); 238 239 return 1; 240 } 83 241 84 242 int dvbapi_read_device(int dmx_fd, unsigned char *buf, int length, int debug) … … 88 246 89 247 if (len==-1) 90 cs_log(" error %d", errno);248 cs_log("dvbapi: read error %d", errno); 91 249 92 250 if (debug==1) 93 cs_debug(" Read %d bytes from demux", len);251 cs_debug("dvbapi: Read %d bytes from demux", len); 94 252 95 253 return len; … … 98 256 int dvbapi_open_device(int index_demux, int type) 99 257 { 100 int dmx_fd ;258 int dmx_fd,i; 101 259 int ca_offset=0; 102 char device_path[ 256];260 char device_path[128]; 103 261 104 262 if (type==0) 105 sprintf(device_path, DMXDEV, index_demux);263 sprintf(device_path, devices[selected_box].demux_device_path, demux[index_demux].demux_index); 106 264 else 107 265 { … … 109 267 ca_offset=1; 110 268 111 sprintf(device_path, CADEV, index_demux+ca_offset); 112 } 113 114 if ((dmx_fd = open(device_path, O_RDWR)) < 0) 115 cs_log("error opening device %s", device_path); 269 sprintf(device_path, devices[selected_box].ca_device_path, demux[index_demux].demux_index+ca_offset); 270 } 271 272 if ((dmx_fd = open(device_path, O_RDWR)) < 0) { 273 if (type==1 && errno==16) // ca device already open 274 for (i=0;i<MAX_DEMUX;i++) 275 if (demux[i].demux_index==demux[index_demux].demux_index && demux[i].ca_fd>0) 276 dmx_fd=demux[i].ca_fd; 277 278 if (dmx_fd<=0) 279 cs_log("dvbapi: error opening device %s (Errno: %d)", device_path, errno); 280 } 116 281 117 282 cs_debug("dvbapi: DEVICE open (%s)", device_path); 118 return dmx_fd;119 }120 121 int dvbapi_set_filter(int demux_index, int type, int pid, unsigned char filt, unsigned char mask, int timeout)122 {123 struct dmx_sct_filter_params sFP;124 int dmx_fd;125 126 cs_debug("dvbapi: set filter pid:%04x, value:%04x",pid, filt);127 128 memset(&sFP,0,sizeof(sFP));129 130 sFP.pid = pid;131 sFP.timeout = timeout;132 sFP.flags = DMX_IMMEDIATE_START;133 sFP.filter.filter[0] = filt;134 sFP.filter.mask[0] = mask;135 136 if (type==0)137 dmx_fd=demux[demux_index].demux_ecm_fd;138 else139 dmx_fd=demux[demux_index].demux_emm_fd;140 141 if (ioctl(dmx_fd, DMX_SET_FILTER, &sFP) < 0)142 {143 cs_log("dvbapi: could not start demux filter");144 return 0;145 }146 147 ioctl(dmx_fd, DMX_START);148 149 283 return dmx_fd; 150 284 } … … 169 303 int dmx_fd, len; 170 304 171 dmx_fd=dvbapi_set_filter(demux_index, 1, pid, 0x80, 0xF0, 8000); 305 dmx_fd=demux[demux_index].demux_emm_fd; 306 307 dvbapi_set_filter(dmx_fd, selected_api, pid, 0x80, 0xF0, 8000); 172 308 173 309 len=dvbapi_read_device(dmx_fd, buf, BUFSIZE, 1); … … 186 322 int dmx_fd, len; 187 323 188 dmx_fd=dvbapi_set_filter(demux_index, 0, pid, 0x80, 0xF0, 2000); 324 dmx_fd=demux[demux_index].demux_ecm_fd; 325 326 dvbapi_set_filter(dmx_fd, selected_api, pid, 0x80, 0xF0, 2000); 189 327 190 328 len=dvbapi_read_device(dmx_fd, buf, BUFSIZE, 1); … … 205 343 206 344 get_cw(er); 345 346 memcpy(demux[demux_index].buffer_cache_dmx, buf, 12); 207 347 } 208 348 return 0; … … 214 354 unsigned short i, j; 215 355 int dmx_fd, len; 216 //unsigned short ca_system_id=demux[demux_index].ca_system_id; 217 218 dmx_fd=dvbapi_set_filter(demux_index, 0, 0x0001, 0x01, 0xFF, 2000); 356 357 dmx_fd=demux[demux_index].demux_ecm_fd; 358 359 dvbapi_set_filter(dmx_fd, selected_api, 0x0001, 0x01, 0xFF, 2000); 219 360 220 361 len=dvbapi_read_device(dmx_fd, buf, BUFSIZE, 1); … … 242 383 } 243 384 244 void dvbapi_stop_descramble(int demux_index) 245 { 246 247 /* 248 if (global_capid != 0) { 249 250 // unset pid?? (not working) 251 252 ca_pid_t ca_pid; 253 memset(&ca_pid,0,sizeof(ca_pid)); 254 ca_pid.pid = global_capid; 255 ca_pid.index = -1; 256 //if (ioctl(camfd, CA_SET_PID, &ca_pid)==-1) perror("Error Remove SET_PID"); 257 } 258 */ 259 260 cs_log("dvbapi: Stop descrambling CAID: %04x", demux[demux_index].ca_system_id); 261 262 demux[demux_index].ca_system_id=0; 263 demux[demux_index].ca_pid=0; 264 demux[demux_index].emm_pid=0; 265 demux[demux_index].provider_id=0; 266 267 if (demux[demux_index].demux_ecm_fd>0) { 268 ioctl(demux[demux_index].demux_ecm_fd,DMX_STOP); 269 close(demux[demux_index].demux_ecm_fd); 270 cs_debug("closing ecm dmx device"); 271 demux[demux_index].demux_ecm_fd=0; 272 } 273 274 if (demux[demux_index].demux_emm_fd>0) { 275 ioctl(demux[demux_index].demux_emm_fd,DMX_STOP); 276 close(demux[demux_index].demux_emm_fd); 277 cs_debug("closing emm dmx device"); 278 demux[demux_index].demux_emm_fd=0; 279 } 280 281 if (demux[demux_index].ca_fd>0) { 282 close(demux[demux_index].ca_fd); 283 cs_debug("closing ca device"); 284 demux[demux_index].ca_fd=0; 385 void dvbapi_stop_descrambling(int demux_id) 386 { 387 int i; 388 389 cs_log("dvbapi: Stop descrambling CAID: %04x", demux[demux_id].ca_system_id); 390 391 demux[demux_id].ca_system_id=0; 392 demux[demux_id].ca_pid=0; 393 demux[demux_id].emm_pid=0; 394 demux[demux_id].provider_id=0; 395 demux[demux_id].demux_index=-1; 396 demux[demux_id].program_number=0; 397 398 if (demux[demux_id].demux_ecm_fd>0) { 399 ioctl(demux[demux_id].demux_ecm_fd,DMX_STOP); 400 close(demux[demux_id].demux_ecm_fd); 401 cs_debug("dvbapi: closing ecm dmx device"); 402 demux[demux_id].demux_ecm_fd=0; 403 } 404 405 if (demux[demux_id].demux_emm_fd>0) { 406 ioctl(demux[demux_id].demux_emm_fd,DMX_STOP); 407 close(demux[demux_id].demux_emm_fd); 408 cs_debug("dvbapi: closing emm dmx device"); 409 demux[demux_id].demux_emm_fd=0; 410 } 411 412 if (demux[demux_id].ca_fd>0) { 413 for (i=0;i<demux[demux_id].STREAMpidcount;i++) 414 { 415 ca_pid_t ca_pid2; 416 memset(&ca_pid2,0,sizeof(ca_pid2)); 417 ca_pid2.pid = demux[demux_id].STREAMpids[i]; 418 ca_pid2.index = -1; 419 if (ioctl(demux[demux_id].ca_fd, CA_SET_PID, &ca_pid2)==-1) 420 cs_debug("dvbapi: Error Stream SET_PID"); 421 } 422 423 ca_descr_t ca_descr; 424 memset(&ca_descr,0,sizeof(ca_descr)); 425 memset(ca_descr.cw, 0 ,8); 426 427 ca_descr.index = demux_id; 428 ca_descr.parity = 0; 429 430 if (ioctl(demux[demux_id].ca_fd, CA_SET_DESCR, &ca_descr) < 0) 431 cs_debug("dvbapi: Error CA_SET_DESCR"); 432 433 ca_descr.index = demux_id; 434 ca_descr.parity = 1; 435 436 if (ioctl(demux[demux_id].ca_fd, CA_SET_DESCR, &ca_descr) < 0) 437 cs_debug("dvbapi: Error CA_SET_DESCR"); 438 439 int needed=0; 440 for (i=0;i<MAX_DEMUX;i++) { 441 if (demux[demux_id].ca_fd==demux[i].ca_fd && i != demux_id) 442 needed=1; 443 } 444 if (needed==0) { 445 close(demux[demux_id].ca_fd); 446 cs_debug("dvbapi: closing ca device"); 447 } 448 demux[demux_id].ca_fd=0; 285 449 } 286 450 … … 288 452 } 289 453 290 void dvbapi_start_descramble(int demux_index, int caid, int capid, unsigned short provider_id) 454 void dvbapi_stop_descrambling_all(int demux_index) 455 { 456 int i,j; 457 for (j=0;j<MAX_DEMUX;j++) { 458 if (demux[j].demux_index != demux_index) 459 continue; 460 461 dvbapi_stop_descrambling(j); 462 } 463 464 return; 465 } 466 467 void dvbapi_start_descrambling(int demux_index, int caid, int capid, unsigned short provider_id) 291 468 { 292 469 int i; … … 301 478 int camfd=dvbapi_open_device(demux_index,1); 302 479 if (camfd<=0) { 303 dvbapi_stop_descramble(demux_index);304 480 return; 305 481 } … … 307 483 demux[demux_index].ca_fd=camfd; 308 484 309 /*310 ca_pid_t ca_pid;311 memset(&ca_pid,0,sizeof(ca_pid));312 ca_pid.pid = capid;313 ca_pid.index = demux_index;314 if (ioctl(camfd, CA_SET_PID, &ca_pid)==-1)315 cs_debug("dvbapi: Error CAPID SET_PID");316 */317 318 485 for (i=0;i<demux[demux_index].STREAMpidcount;i++) 319 486 { 320 321 487 ca_pid_t ca_pid2; 322 488 memset(&ca_pid2,0,sizeof(ca_pid2)); … … 324 490 ca_pid2.index = -1; 325 491 if (ioctl(camfd, CA_SET_PID, &ca_pid2)==-1) 326 cs_debug("dvbapi: Error Stream SET_PID");492 cs_debug("dvbapi: Error unset Stream SET_PID"); 327 493 328 494 memset(&ca_pid2,0,sizeof(ca_pid2)); … … 335 501 } 336 502 503 void dvbapi_try_descrambling (int demux_index) 504 { 505 int n; 506 unsigned int program_number; 507 508 program_number=demux[demux_index].program_number; 509 for (n=0; n<demux[demux_index].ECMpidcount; n++) { 510 511 if (demux[demux_index].ca_system_id!=0) // got valid cw -> stop trying 512 break; 513 514 if (program_number!=demux[demux_index].program_number) //channel change -> stop trying 515 break; 516 517 dvbapi_stop_filter(demux_index,0); 518 dvbapi_stop_filter(demux_index,1); 519 520 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); 521 522 //grep emm provid 523 unsigned short provid=0; 524 if (cfg->dvbapi_au==1) 525 { 526 if (demux[demux_index].ECMpids[n].EMM_PID>0) 527 provid=dvbapi_get_provid(demux_index, demux[demux_index].ECMpids[n].EMM_PID); 528 } 529 530 //cs_log("Provider ID: %04x", provid); 531 532 //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); 534 535 sleep(3); //try next if no cw for .. secs 536 } 537 } 538 539 void *thread_descrambling(void *di) 540 { 541 int demux_index=(int*)di; 542 int dmx1_fd,dmx2_fd,n=30,k=0; 543 unsigned int program_number; 544 545 cs_log("dvbapi: Start descrambling Thread %d", demux_index); 546 547 dmx1_fd = dvbapi_open_device(demux_index,0); //ECM,CAT 548 dmx2_fd = dvbapi_open_device(demux_index,0); //EMM 549 550 demux[demux_index].demux_ecm_fd=dmx1_fd; 551 demux[demux_index].demux_emm_fd=dmx2_fd; 552 553 dvbapi_parse_cat(demux_index); 554 555 program_number=demux[demux_index].program_number; 556 557 while(1) 558 { 559 if (demux[demux_index].ca_system_id!=0) // got valid cw -> stop trying 560 break; 561 562 if (program_number!=demux[demux_index].program_number) //channel change -> new thread 563 return 0; 564 565 if (n>=30) 566 { 567 if (demux[demux_index].ca_system_id==0) 568 dvbapi_try_descrambling(demux_index); 569 n=0; 570 k++; 571 } 572 n++; 573 574 if (k==5) // give up 575 return 0; 576 577 sleep(1); 578 } 579 580 581 struct pollfd pfd2[MAX_DEMUX*2]; 582 int rc,len,i,pfdcount; 583 unsigned char buffer[BUFSIZE]; 584 585 while(1) 586 { 587 588 pfdcount=0; 589 590 if (program_number!=demux[demux_index].program_number || demux[demux_index].ca_system_id==0) //channel change -> new thread 591 break; 592 593 if (demux[demux_index].demux_ecm_fd>0) { 594 pfd2[pfdcount].fd = demux[demux_index].demux_ecm_fd; 595 pfd2[pfdcount].events = (POLLIN | POLLPRI); 596 pfdcount++; 597 } else break; 598 if (demux[demux_index].demux_emm_fd>0) { 599 pfd2[pfdcount].fd = demux[demux_index].demux_emm_fd; 600 pfd2[pfdcount].events = (POLLIN | POLLPRI); 601 pfdcount++; 602 } else break; 603 604 605 rc=poll(pfd2, pfdcount, 1000); 606 607 for (i = 0; i < pfdcount; i++) { 608 if (pfd2[i].revents & (POLLIN | POLLPRI)) { 609 610 if ((len=dvbapi_read_device(pfd2[i].fd, buffer, BUFSIZE, 0)) <= 0) 611 continue; 612 613 if (pfd2[i].fd==demux[demux_index].demux_ecm_fd) { 614 //ECM 615 616 if (len != (((buffer[1] & 0xf) << 8) | buffer[2]) + 3) //invaild CAT length 617 continue; 618 619 if (buffer[0] == 0x80 | buffer[0] == 0x81) 620 { 621 if (memcmp(buffer, demux[demux_index].buffer_cache_dmx, 12) != 0) { 622 memcpy(demux[demux_index].buffer_cache_dmx, buffer, 12); 623 cs_debug("Read %d bytes\tTable-id: %02x\tCA section length: %d", len, buffer[0], len); 624 625 if (len>0) { 626 ECM_REQUEST *er; 627 628 if (!(er=get_ecmtask())) 629 continue; 630 631 er->srvid = demux[demux_index].program_number; 632 er->caid = demux[demux_index].ca_system_id; 633 er->prid = demux[demux_index].provider_id; 634 635 er->l=len; 636 memcpy(er->ecm, buffer, er->l); 637 638 get_cw(er); 639 } 640 } 641 } 642 } 643 if (pfd2[i].fd==demux[demux_index].demux_emm_fd) { 644 //EMM 645 646 if (cfg->dvbapi_au!=1) 647 continue; 648 649 cs_debug("EMM Type: 0x%02x", buffer[0]); 650 651 cs_ddump(buffer, len, "emm:"); 652 653 //force emm output 654 reader[ridx].logemm=9999; 655 656 memset(&epg, 0, sizeof(epg)); 657 658 epg.caid[0] = (uchar)(demux[demux_index].ca_system_id>>8); 659 epg.caid[1] = (uchar)(demux[demux_index].ca_system_id); 660 661 epg.provid[2] = (uchar)(demux[demux_index].provider_id>>8); 662 epg.provid[3] = (uchar)(demux[demux_index].provider_id); 663 664 epg.l=len; 665 memcpy(epg.emm, buffer, epg.l); 666 memcpy(epg.hexserial, reader[client[cs_idx].au].hexserial, 8); 667 668 do_emm(&epg); 669 } 670 } 671 } 672 } 673 674 cs_log("dvbapi: Stop descrambling Thread %d", demux_index); 675 676 return 0; 677 } 678 337 679 // from tuxbox camd 338 680 int dvbapi_parse_capmt(unsigned char *buffer, unsigned int length) 339 681 { 340 unsigned short i, j;341 int n, added, ca_mask=1, demux_index =0;682 int i, j, u; 683 int n, added, ca_mask=1, demux_index2=0; 342 684 343 685 int ca_pmt_list_management = buffer[0]; 344 unsigned shortint program_number = (buffer[1] << 8) | buffer[2];345 int program_info_length = ((buffer[4] & 0x0F) << 8) | buffer[5];686 unsigned int program_number = (buffer[1] << 8) | buffer[2]; 687 unsigned int program_info_length = ((buffer[4] & 0x0F) << 8) | buffer[5]; 346 688 347 689 switch (ca_pmt_list_management) 348 690 { 349 case 0x01: 350 //FIXME?? (first) 351 break; 352 case 0x03: 353 //default (only) 354 break; 355 default: 356 //FIXME?? (unknown) 357 break; 358 } 359 360 if (buffer[17]==0x82) { 691 case 0x01: 692 //(first) 693 break; 694 case 0x03: 695 //default (only) 696 break; 697 case 0x04: 698 //(add) 699 break; 700 default: 701 //FIXME?? (unknown) 702 break; 703 } 704 705 if (buffer[17]==0x82 && buffer[18]==0x02) { 706 //enigma2 361 707 ca_mask = buffer[19]; 362 demux_index = buffer[20]; 363 } 364 365 if (demux[demux_index].program_number==((buffer[1] << 8) | buffer[2])) 366 return 0; 708 demux_index2 = buffer[20]; 709 } else { 710 //neutrino workaround 711 dvbapi_stop_descrambling_all(0); 712 } 713 714 715 for (i=0;i<MAX_DEMUX;i++) { 716 if (demux[i].demux_index==demux_index2) { 717 if (demux[i].program_number==((buffer[1] << 8) | buffer[2])) { // already descrambling prog on this device 718 if (demux[i].active==1) { 719 //remove any inactive program 720 for (u=0;u<MAX_DEMUX;u++) { 721 if (demux[u].demux_index==demux_index2 && demux[u].active==0) 722 dvbapi_stop_descrambling(u); 723 demux[u].active=0; 724 } 725 726 } else 727 demux[i].active=1; 728 return 0; 729 } 730 } 731 } 732 733 //get free id 734 int demux_id=-1; 735 for (i=0;i<MAX_DEMUX;i++) { 736 if (demux[i].program_number==0) 737 { 738 demux_id=i; 739 break; 740 } 741 } 742 743 cs_debug("dvbapi: got id %d", demux_id); 744 745 if (demux_id<0) { 746 cs_log("dvbapi: error no free id (MAX_DEMUX)"); 747 return; 748 } 367 749 368 750 cs_ddump(buffer, length, "capmt:"); … … 370 752 //cs_debug("program_info_length: %d", program_info_length); 371 753 372 demux[demux_index].program_number=((buffer[1] << 8) | buffer[2]); 373 demux[demux_index].ECMpidcount=0; 374 375 demux[demux_index].cadev_index=ca_mask; 754 demux[demux_id].program_number=((buffer[1] << 8) | buffer[2]); 755 demux[demux_id].demux_index=demux_index2; 756 demux[demux_id].ECMpidcount=0; 757 demux[demux_id].STREAMpidcount=0; 758 demux[demux_id].active=1; 759 760 cs_debug("dvbapi: demux index %d", demux[demux_id].demux_index); 376 761 377 762 //CA_PIDS for all streams 378 379 763 if (program_info_length != 0) 380 764 { 381 //int ca_pmt_cmd_id = buffer[6];382 //cs_debug("ca_pmt_id: %02x", ca_pmt_cmd_id);765 int ca_pmt_cmd_id = buffer[6]; 766 cs_debug("ca_pmt_id: %02x", ca_pmt_cmd_id); 383 767 int descriptor_length=0; 384 768 for (i = 0; i < program_info_length - 1; i += descriptor_length + 2) … … 391 775 392 776 if (buffer[i + 7] == 0x09) { 393 demux[demux_i ndex].ECMpids[demux[demux_index].ECMpidcount].CA_PID=ca_pid;394 demux[demux_i ndex].ECMpids[demux[demux_index].ECMpidcount].CA_System_ID=ca_system_id;395 demux[demux_i ndex].ECMpids[demux[demux_index].ECMpidcount].EMM_PID=0;396 demux[demux_i ndex].ECMpidcount++;777 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CA_PID=ca_pid; 778 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CA_System_ID=ca_system_id; 779 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].EMM_PID=0; 780 demux[demux_id].ECMpidcount++; 397 781 } 398 399 if (buffer[i + 7] == 0x82) { 400 ca_mask = buffer[i + 9]; 401 demux_index = buffer[i + 10]; 402 demux[demux_index].cadev_index=ca_mask; 403 } 404 } 405 } 406 407 demux[demux_index].STREAMpidcount=0; 782 } 783 } 408 784 409 785 //CA_PIDs for a single stream 410 411 unsigned short es_info_length=0; 786 unsigned int es_info_length=0; 412 787 for (i = program_info_length + 6; i < length; i += es_info_length + 5) 413 788 { … … 418 793 cs_debug("stream_type: %02x\telementary_pid: %04x\tes_info_length: %04x", stream_type, elementary_pid, es_info_length); 419 794 420 demux[demux_i ndex].STREAMpids[demux[demux_index].STREAMpidcount]=elementary_pid;421 demux[demux_i ndex].STREAMpidcount++;795 demux[demux_id].STREAMpids[demux[demux_id].STREAMpidcount]=elementary_pid; 796 demux[demux_id].STREAMpidcount++; 422 797 423 798 if (es_info_length != 0) 424 799 { 425 //int ca_pmt_cmd_id = buffer[i + 5]; 800 int ca_pmt_cmd_id = buffer[i + 5]; 801 cs_debug("dvbapi: ca_pmt_cmd_id 0x%02x", ca_pmt_cmd_id); 426 802 int descriptor_length=0; 427 803 for (j = 0; j < es_info_length - 1; j += descriptor_length + 2) … … 435 811 if (buffer[i + j + 6] == 0x09) { 436 812 added=0; 437 for (n=0;n<demux[demux_i ndex].ECMpidcount;n++) {438 if (demux[demux_i ndex].ECMpids[n].CA_System_ID==descriptor_ca_system_id)813 for (n=0;n<demux[demux_id].ECMpidcount;n++) { 814 if (demux[demux_id].ECMpids[n].CA_System_ID==descriptor_ca_system_id) 439 815 added=1; 440 816 } 441 817 if (added==0) { 442 demux[demux_i ndex].ECMpids[demux[demux_index].ECMpidcount].CA_PID=descriptor_ca_pid;443 demux[demux_i ndex].ECMpids[demux[demux_index].ECMpidcount].CA_System_ID=descriptor_ca_system_id;444 demux[demux_i ndex].ECMpids[demux[demux_index].ECMpidcount].EMM_PID=0;445 demux[demux_i ndex].ECMpidcount++;818 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CA_PID=descriptor_ca_pid; 819 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CA_System_ID=descriptor_ca_system_id; 820 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].EMM_PID=0; 821 demux[demux_id].ECMpidcount++; 446 822 } 447 823 } … … 450 826 } 451 827 452 dvbapi_stop_descramble(demux_index); 453 454 int dmx1_fd,dmx2_fd; 455 456 if (demux[demux_index].ECMpidcount>0) { 457 dmx1_fd = dvbapi_open_device(demux_index,0); //ECM,CAT 458 dmx2_fd = dvbapi_open_device(demux_index,0); //EMM 459 460 demux[demux_index].demux_ecm_fd=dmx1_fd; 461 demux[demux_index].demux_emm_fd=dmx2_fd; 462 463 dvbapi_parse_cat(demux_index); 464 } 465 466 cs_log("dvbapi: Found %d ECMpids in PMT", demux[demux_index].ECMpidcount); 467 cs_debug("dvbapi: Found %d STREAMpids in PMT", demux[demux_index].STREAMpidcount); 468 469 for (n=0; n<demux[demux_index].ECMpidcount; n++) { 470 471 if (demux[demux_index].ca_system_id!=0) 472 continue; 473 474 dvbapi_stop_filter(demux_index,0); 475 dvbapi_stop_filter(demux_index,1); 476 477 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); 478 479 //grep emm provid 480 481 unsigned short provid=0; 482 if (cfg->dvbapi_au==1) 483 { 484 if (demux[demux_index].ECMpids[n].EMM_PID>0) 485 provid=dvbapi_get_provid(demux_index, demux[demux_index].ECMpids[n].EMM_PID); 486 } 487 488 //cs_log("Provider ID: %04x", provid); 489 490 //grep ecm 491 dvbapi_get_single_ecm(demux_index, demux[demux_index].ECMpids[n].CA_System_ID,demux[demux_index].ECMpids[n].CA_PID, provid); 492 493 494 sleep(3); //try next if no cw for .. secs 495 } 828 pthread_t p3; 829 830 cs_log("dvbapi: Found %d ECMpids in PMT", demux[demux_id].ECMpidcount); 831 cs_debug("dvbapi: Found %d STREAMpids in PMT", demux[demux_id].STREAMpidcount); 832 833 if (demux[demux_id].ECMpidcount>0) { 834 pthread_create (&p3, NULL, thread_descrambling, (void *)demux_id); 835 } 836 496 837 497 838 return 0; 498 839 } 840 499 841 500 842 void dvbapi_handlesockmsg (unsigned char *buffer, ssize_t len) … … 505 847 //cs_dump(buffer, len, "handlesockmsg:"); 506 848 507 if (buffer[0] != 0x9F ) {849 if (buffer[0] != 0x9F || buffer[1] != 0x80) { 508 850 cs_log("dvbapi: unknown socket command: %02x", buffer[0]); 509 851 return; 510 852 } 511 512 if (buffer[1] != 0x80) {513 cs_log("dvbapi: unknown apdu tag");514 return;515 }516 517 853 518 854 if (buffer[3] & 0x80) { … … 528 864 } 529 865 530 if (buffer[2] == 0x30) // ca_info_enq 531 cs_debug("ca_info!!"); 532 else if (buffer[2] == 0x32) // ca_pmt 533 { 534 if ((3 + size + val) == len) 535 dvbapi_parse_capmt(buffer + 3 + size, val); 536 else 537 cs_log("dvbapi: ca_pmt invalid length"); 538 } 539 else if (buffer[2] == 0x3f) 540 { 541 //9F 80 3f 04 83 02 00 00 542 //zap? 543 //cs_debug("zap!"); 544 } else 545 { 546 cs_log("dvbapi: handlesockmsg() unknown command"); 547 cs_dump(buffer, len, "unknown command:"); 548 } 549 } 550 551 static int dvbapi_init_listenfd() { 866 switch(buffer[2]) 867 { 868 case 0x30: 869 cs_debug("ca_info!!"); 870 break; 871 case 0x32: 872 if ((3 + size + val) == len) 873 dvbapi_parse_capmt(buffer + 3 + size, val); 874 else 875 cs_log("dvbapi: ca_pmt invalid length"); 876 break; 877 case 0x3f: 878 //9F 80 3f 04 83 02 00 <demux index> 879 cs_ddump(buffer, len, "capmt 3f:"); 880 int demux_index=buffer[7]; 881 dvbapi_stop_descrambling_all(demux_index); 882 break; 883 default: 884 cs_log("dvbapi: handlesockmsg() unknown command"); 885 cs_dump(buffer, len, "unknown command:"); 886 break; 887 } 888 } 889 890 int dvbapi_init_listenfd() { 552 891 553 892 int clilen; … … 556 895 memset(&servaddr, 0, sizeof(struct sockaddr_un)); 557 896 servaddr.sun_family = AF_UNIX; 558 strcpy(servaddr.sun_path, CAMDSOCKET);897 strcpy(servaddr.sun_path, devices[selected_box].cam_socket_path); 559 898 clilen = sizeof(servaddr.sun_family) + strlen(servaddr.sun_path); 560 899 561 if ((unlink( CAMDSOCKET) < 0) && (errno != ENOENT))900 if ((unlink(devices[selected_box].cam_socket_path) < 0) && (errno != ENOENT)) 562 901 return 0; 563 902 if ((listenfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) … … 592 931 593 932 if (len < 3) { 594 cs_debug(" Client: camd.socket: too short message received");933 cs_debug("dvbapi: camd.socket: too short message received"); 595 934 continue; 596 935 } … … 612 951 } 613 952 614 demux_search dvbapi_find_dmx_by_fd(int fd) 615 { 616 int i; 617 demux_search s1; 618 619 s1.type=0; 620 s1.index=0; 621 622 for (i=0;i<MAX_DEMUX;i++) { 623 if (demux[i].demux_ecm_fd==fd) { 624 s1.type=0; 625 s1.index=i; 626 return s1; 627 } 628 if (demux[i].demux_emm_fd==fd) { 629 s1.type=1; 630 s1.index=i; 631 return s1; 632 } 633 } 634 635 return s1; 636 } 637 638 int dvbapi_get_index_by_prgnr(unsigned short int prognr) 639 { 640 int i; 641 for (i=0;i<MAX_DEMUX;i++) 642 if (demux[i].program_number==prognr) 643 return i; 644 645 return -1; 646 } 647 648 void *thread_check_demux(void *arg) { 649 650 struct pollfd pfd2[MAX_DEMUX*2]; 651 int rc,len,i,pfdcount; 652 unsigned char buffer[BUFSIZE]; 653 demux_search s1; 654 655 while(1) 656 { 657 658 pfdcount=0; 659 for (i=0;i<MAX_DEMUX;i++) { 660 if (demux[i].ca_system_id==0) continue; // ignore inactive tuner 661 662 if (demux[i].demux_ecm_fd>0) { 663 pfd2[pfdcount].fd = demux[i].demux_ecm_fd; 664 pfd2[pfdcount].events = (POLLIN | POLLPRI); 665 pfdcount++; 666 } 667 if (demux[i].demux_emm_fd>0) { 668 pfd2[pfdcount].fd = demux[i].demux_emm_fd; 669 pfd2[pfdcount].events = (POLLIN | POLLPRI); 670 pfdcount++; 671 } 672 673 } 674 675 rc=poll(pfd2, pfdcount, 1000); 676 677 for (i = 0; i < pfdcount; i++) { 678 if (pfd2[i].revents & (POLLIN | POLLPRI)) { 679 s1=dvbapi_find_dmx_by_fd(pfd2[i].fd); 680 681 if ((len=dvbapi_read_device(pfd2[i].fd, buffer, BUFSIZE, 0)) <= 0) 682 break; 683 684 if (s1.type==0) { 685 //ECM 686 687 if (len != (((buffer[1] & 0xf) << 8) | buffer[2]) + 3) //invaild CAT length 688 break; 689 690 if (buffer[0] == 0x80 | buffer[0] == 0x81) 691 { 692 if (memcmp(buffer, demux[s1.index].buffer_cache_dmx, 12) != 0) { 693 memcpy(demux[s1.index].buffer_cache_dmx, buffer, 12); 694 //if (!dvbapi_parse_ecm(s1.index,buffer,len)) { cs_log("Error while parsing ECM"); } 695 cs_debug("Read %d bytes\tTable-id: %02x\tCA section length: %d", len, buffer[0], len); 696 697 if (len>0) { 698 ECM_REQUEST *er; 699 700 if (!(er=get_ecmtask())) 701 break; 702 703 er->srvid = demux[s1.index].program_number; 704 er->caid = demux[s1.index].ca_system_id; 705 er->prid = demux[s1.index].provider_id; 706 707 er->l=len; 708 memcpy(er->ecm, buffer, er->l); 709 710 get_cw(er); 711 } 712 } 713 } 714 } 715 if (s1.type==1) { 716 //EMM 717 718 if (cfg->dvbapi_au!=1) 719 break; 720 721 cs_debug("EMM Type: 0x%02x", buffer[0]); 722 723 cs_ddump(buffer, len, "emm:"); 724 725 //force emm output 726 727 reader[ridx].logemm=9999; 728 729 memset(&epg, 0, sizeof(epg)); 730 731 epg.caid[0] = (uchar)(demux[s1.index].ca_system_id>>8); 732 epg.caid[1] = (uchar)(demux[s1.index].ca_system_id); 733 //if (reader[client[cs_idx].au].caid[0]!=b2i(2,epg.caid)) cs_log("caid %04x", b2i(2,epg.caid)); 734 //memcpy(epg.provid, prov, 4); 735 736 epg.l=len; 737 memcpy(epg.emm, buffer, epg.l); 738 memcpy(epg.hexserial, reader[client[cs_idx].au].hexserial, 8); 739 740 do_emm(&epg); 741 742 } 743 744 } 745 } 746 747 } 748 return 0; 953 void dvbapi_cleanup(int sig_num) 954 { 955 /* cleanup */ 956 if (strcmp(cfg->dvbapi_boxtype, "ufs910")==0) { 957 //prevent ufs910 from crashing when old cw set 958 dvbapi_stop_descrambling_all(0); 959 dvbapi_stop_descrambling_all(1); 960 } 961 962 exit(0); 749 963 } 750 964 … … 753 967 struct pollfd pfd2[1]; 754 968 int i,rc; 755 pthread_t p1, p2; 969 pthread_t p1; 970 971 signal(SIGTERM, dvbapi_cleanup); 972 signal(SIGINT, dvbapi_cleanup); 756 973 757 974 if (cfg->dvbapi_usr[0]==0) { … … 775 992 demux[i].cadev_index=-1; 776 993 demux[i].ca_fd=0; 777 demux[i]. received_emm=0;994 demux[i].demux_index=-1; 778 995 779 996 memset(demux[i].buffer_cache_dmx,0 ,12); 997 } 998 999 dvbapi_detect_api(); 1000 1001 if (selected_box == -1 || selected_api==-1) { 1002 cs_log("dvbapi: could not detect api version"); 1003 return 1; 780 1004 } 781 1005 … … 786 1010 } 787 1011 1012 788 1013 pfd2[0].fd = fd_m2c; 789 1014 pfd2[0].events = (POLLIN | POLLPRI); 790 1015 791 1016 pthread_create (&p1, NULL, thread_check_zap, NULL); 792 pthread_create (&p2, NULL, thread_check_demux, NULL);793 1017 794 1018 struct timeb tp; … … 800 1024 cs_exit(0); 801 1025 802 rc=poll(pfd2, 1, 500); 1026 1027 chk_pending(tp); 1028 1029 rc=poll(pfd2, 1, 1000); 803 1030 804 1031 if (rc<0) … … 807 1034 if (pfd2[0].revents & (POLLIN | POLLPRI)) { 808 1035 chk_dcw(fd_m2c); 809 chk_pending(tp); 1036 810 1037 } 811 1038 … … 818 1045 { 819 1046 unsigned char cw_0[8], cw_1[8]; 1047 int i; 820 1048 821 1049 cs_debug("dvbapi: ECM rc: %d", er->rc); … … 824 1052 memcpy(cw_1, er->cw+8, 8); 825 1053 826 //this is not working when both tuner on one channel 827 828 int demux_index=dvbapi_get_index_by_prgnr(er->srvid); 829 if (demux_index>=0) { 830 if (er->rc<=3 && demux[demux_index].ca_system_id==0) { 831 dvbapi_start_descramble(demux_index, er->caid, er->pid, er->prid); 832 } 833 } else { 834 cs_log("dvbapi: error cant find demux index"); 835 } 836 837 if (er->rc>3) { 838 cs_debug("dvbapi: cw not found"); 839 return; 840 } 841 842 ca_descr_t ca_descr; 843 memset(&ca_descr,0,sizeof(ca_descr)); 844 845 if (demux[demux_index].ca_fd<=0) 846 { 847 cs_log("dvbapi: could not write cw."); 848 return; 849 } 850 851 if (memcmp(cw_0,demux[demux_index].lastcw0,8)) 852 { 853 ca_descr.index = demux_index; 854 ca_descr.parity = 0; 855 memcpy(demux[demux_index].lastcw0,cw_0,8); 856 memcpy(ca_descr.cw,cw_0,8); 857 cs_debug("dvbapi: write cw1"); 858 if (ioctl(demux[demux_index].ca_fd, CA_SET_DESCR, &ca_descr) < 0) cs_debug("dvbapi: Error CA_SET_DESCR"); 859 } 860 861 if (memcmp(cw_1,demux[demux_index].lastcw1,8)) 862 { 863 ca_descr.index = demux_index; 864 ca_descr.parity = 1; 865 memcpy(demux[demux_index].lastcw1,cw_1,8); 866 memcpy(ca_descr.cw,cw_1,8); 867 cs_debug("dvbapi: write cw2"); 868 if (ioctl(demux[demux_index].ca_fd, CA_SET_DESCR, &ca_descr) < 0) cs_debug("dvbapi: Error CA_SET_DESCR"); 869 } 870 1054 int cam_fd=0; 1055 1056 for (i=0;i<MAX_DEMUX;i++) 1057 { 1058 if (demux[i].program_number==er->srvid) 1059 { 1060 1061 if (er->rc<=2 && demux[i].ca_system_id==0 && er->caid!=0) { 1062 dvbapi_start_descrambling(i, er->caid, er->pid, er->prid); 1063 } 1064 1065 if (er->rc>3) { 1066 cs_debug("dvbapi: cw not found"); 1067 return; 1068 } 1069 1070 ca_descr_t ca_descr; 1071 memset(&ca_descr,0,sizeof(ca_descr)); 1072 1073 if (demux[i].ca_fd<=0) 1074 { 1075 cs_log("dvbapi: could not write cw."); 1076 return; 1077 } 1078 1079 if (memcmp(cw_0,demux[i].lastcw0,8)) 1080 { 1081 ca_descr.index = i; 1082 ca_descr.parity = 0; 1083 memcpy(demux[i].lastcw0,cw_0,8); 1084 memcpy(ca_descr.cw,cw_0,8); 1085 cs_debug("dvbapi: write cw1 index: %d", i); 1086 if (ioctl(demux[i].ca_fd, CA_SET_DESCR, &ca_descr) < 0) 1087 cs_debug("dvbapi: Error CA_SET_DESCR"); 1088 } 1089 1090 if (memcmp(cw_1,demux[i].lastcw1,8)) 1091 { 1092 ca_descr.index = i; 1093 ca_descr.parity = 1; 1094 memcpy(demux[i].lastcw1,cw_1,8); 1095 memcpy(ca_descr.cw,cw_1,8); 1096 cs_debug("dvbapi: write cw2 index: %d", i); 1097 if (ioctl(demux[i].ca_fd, CA_SET_DESCR, &ca_descr) < 0) 1098 cs_debug("dvbapi: Error CA_SET_DESCR"); 1099 } 1100 } 1101 } 871 1102 } 872 1103 … … 909 1140 910 1141 return; 911 912 } 1142 } 1143 1144 913 1145 914 1146 /* … … 920 1152 strcpy(ph->desc, "dvbapi"); 921 1153 ph->type=MOD_CONN_SERIAL; 922 ph->multi= 0;1154 ph->multi=1; 923 1155 ph->watchdog=0; 924 1156 ph->s_handler=dvbapi_handler; 925 1157 ph->send_dcw=dvbapi_send_dcw; 926 1158 } 927 #endif // HAVE_DVBAPI _31159 #endif // HAVE_DVBAPI -
trunk/oscam-config.c
r1102 r1115 532 532 static void chk_t_dvbapi(char *token, char *value) 533 533 { 534 #ifndef HAVE_DVBAPI _3534 #ifndef HAVE_DVBAPI 535 535 fprintf(stderr, "Warning: OSCam compiled without DVB API support.\n"); 536 536 #else -
trunk/oscam.c
r1093 r1115 2191 2191 module_radegast, 2192 2192 module_oscam_ser, 2193 #ifdef HAVE_DVBAPI _32193 #ifdef HAVE_DVBAPI 2194 2194 module_dvbapi, 2195 2195 #endif
Note:
See TracChangeset
for help on using the changeset viewer.