Changeset 8008
- Timestamp:
- 12/29/12 14:41:46 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-dvbapi.c
r8003 r8008 585 585 } 586 586 587 static pthread_mutex_t lockindex = PTHREAD_MUTEX_INITIALIZER; 587 588 int32_t dvbapi_get_descindex(void) { 589 pthread_mutex_lock(&lockindex); // to avoid race when readers become responsive! 588 590 int32_t i,j,idx=1,fail=1; 589 591 while (fail) { 590 592 fail=0; 593 cs_sleepus(0); 591 594 for (i=0;i<MAX_DEMUX;i++) { 592 for (j=0;j<demux[i].ECMpidcount;j++) { 595 for (j=0;j<demux[i].ECMpidcount;j++) { 593 596 if (demux[i].ECMpids[j].index==idx) { 594 597 idx++; … … 599 602 } 600 603 } 604 pthread_mutex_unlock(&lockindex); // and release it! 601 605 return idx; 602 606 } … … 698 702 699 703 void dvbapi_start_descrambling(int32_t demux_id) { 700 int32_t j,k ;704 int32_t j,k,n; 701 705 int32_t streamcount=0; 702 706 703 707 int32_t last_pidindex = demux[demux_id].pidindex; 704 708 demux[demux_id].pidindex = demux[demux_id].curindex; 705 709 710 for (n=0; n<demux[demux_id].ECMpidcount; n++) { // cleanout old indexes of pids that have now status ignore (=no decoding possible!) 711 if (demux[demux_id].ECMpids[n].status == -1) demux[demux_id].ECMpids[n].index = 0; // reset index! 712 } 706 713 for (j=0; j<demux[demux_id].ECMpidcount; j++) { 707 714 if (demux[demux_id].curindex == j || (demux[demux_id].ECMpids[demux[demux_id].curindex].CAID == demux[demux_id].ECMpids[j].CAID 708 715 && demux[demux_id].ECMpids[demux[demux_id].curindex].PROVID == demux[demux_id].ECMpids[j].PROVID 709 && demux[demux_id].ECMpids[j].PROVID > 0 && demux[demux_id].ECMpids[demux[demux_id].curindex].ECM_PID == demux[demux_id].ECMpids[j].ECM_PID)) { 716 && demux[demux_id].ECMpids[j].PROVID > 0 717 && demux[demux_id].ECMpids[demux[demux_id].curindex].ECM_PID == demux[demux_id].ECMpids[j].ECM_PID)) { 710 718 711 719 if (demux[demux_id].curindex != j) { … … 716 724 } 717 725 718 if (!demux[demux_id].ECMpids[j].index )726 if (!demux[demux_id].ECMpids[j].index && demux[demux_id].ECMpids[n].status != -1) // status of pid = ignore -> skip! 719 727 demux[demux_id].ECMpids[j].index=dvbapi_get_descindex(); 720 728 … … 1399 1407 } 1400 1408 1401 if (cfg.dvbapi_requestmode != 1) 1409 if (cfg.dvbapi_requestmode != 1){ 1402 1410 dvbapi_stop_filter(demux_id, TYPE_ECM); 1411 } 1403 1412 1404 1413 cs_debug_mask(D_DVBAPI,"[TRY PID %d] CAID: %04X PROVID: %06X CA_PID: %04X", num, demux[demux_id].ECMpids[num].CAID, demux[demux_id].ECMpids[num].PROVID, demux[demux_id].ECMpids[num].ECM_PID); … … 2230 2239 2231 2240 for (n=0;n<2;n++) { 2232 if (memcmp(cw+(n*8),demux[demux_id].lastcw[n],8)!=0 && memcmp(cw+(n*8),nullcw,8)!=0) { 2241 char lastcw[9*3]; 2242 char newcw[9*3]; 2243 cs_hexdump(0, demux[demux_id].lastcw[n], 8, lastcw, sizeof(lastcw)); 2244 cs_hexdump(0, cw+(n*8), 8, newcw, sizeof(newcw)); 2245 if (memcmp(cw+(n*8),demux[demux_id].lastcw[n],8)!=0 && memcmp(cw+(n*8),nullcw,8)!=0) { // check if already delivered and new cw part is valid! 2233 2246 ca_descr.index = idx; 2234 2247 ca_descr.parity = n; 2248 cs_debug_mask(D_DVBAPI,"writing %s part (%s) of controlword, replacing expired (%s)",(n == 1?"odd":"even"), newcw, lastcw); 2235 2249 memcpy(demux[demux_id].lastcw[n],cw+(n*8),8); 2236 2250 memcpy(ca_descr.cw,cw+(n*8),8); … … 2379 2393 struct s_dvbapi_priority *forceentry=dvbapi_check_prio_match(i, demux[i].curindex, 'p'); 2380 2394 if (!forceentry) { 2381 demux[i].curindex = 0; 2395 demux[i].curindex = 0; 2396 demux[i].ECMpids[(demux[i].pidindex)].index = 0; // reset index since ecm request failed 2382 2397 demux[i].pidindex = -1; 2383 2398 dvbapi_try_next_caid(i);
Note:
See TracChangeset
for help on using the changeset viewer.