Changeset 3531
- Timestamp:
- 10/15/10 06:36:06 (13 years ago)
- Location:
- branches/dvbapi-experimental
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/dvbapi-experimental/module-dvbapi.c
r3527 r3531 321 321 } 322 322 323 void dvbapi_add_ecmpid(int demux_id, ushort caid, ushort ecmpid, ulong provid, int chid) {324 int n ,added=0;323 void dvbapi_add_ecmpid(int demux_id, ushort caid, ushort ecmpid, ulong provid, unsigned char streamtype) { 324 int n; 325 325 326 326 if (demux[demux_id].ECMpidcount>=ECM_PIDS) … … 328 328 329 329 char stream = demux[demux_id].STREAMpidcount-1; 330 for (n=0;n<demux[demux_id].ECMpidcount;n++) { 331 if (stream>-1 && demux[demux_id].ECMpids[n].CAID == caid && demux[demux_id].ECMpids[n].ECM_PID == ecmpid) { 332 added=1; 333 demux[demux_id].ECMpids[n].stream[demux[demux_id].ECMpids[n].slen++]=stream; 334 cs_log("[ADD STREAM %d] CAID: %04X\tECM_PID: %04X\tPROVID: %06X", n, caid, ecmpid, provid); 335 } 336 } 330 for (n=0;n<demux[demux_id].ECMpidcount;n++) 331 if (demux[demux_id].ECMpids[n].CAID == caid && demux[demux_id].ECMpids[n].ECM_PID == ecmpid ) 332 { 333 demux[demux_id].ECMpids[n].stream[demux[demux_id].ECMpids[n].slen++]=stream; 334 if (demux[demux_id].ECMpids[n].sflag != 0 && demux[demux_id].ECMpids[n].sflag != streamtype) demux[demux_id].ECMpids[n].sflag=0; 335 cs_log("[ADD PID %d] CAID: %04X\tECM_PID: %04X\tPROVID: %06X STREAM: %#x SFLAG: %#x", n, caid, ecmpid, provid,streamtype,demux[demux_id].ECMpids[n].sflag); 336 break; 337 } 337 338 338 if (added==0) { 339 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].ECM_PID = ecmpid; 340 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CAID = caid; 341 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].PROVID = provid; 342 if (stream>-1) { 343 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].stream[demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].slen++]=stream; 344 } 345 cs_log("[ADD PID %d] CAID: %04X\tECM_PID: %04X\tPROVID: %06X", demux[demux_id].ECMpidcount, caid, ecmpid, provid); 346 demux[demux_id].ECMpidcount++; 347 } 339 if (n == demux[demux_id].ECMpidcount) 340 { 341 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].ECM_PID = ecmpid; 342 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].CAID = caid; 343 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].PROVID = provid; 344 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].stream[demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].slen++] = stream; 345 demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].sflag = streamtype; 346 cs_log("[ADD PID %d] CAID: %04X\tECM_PID: %04X\tPROVID: %06X STREAM: %#x SFLAG: %#x", demux[demux_id].ECMpidcount, caid, ecmpid, provid,streamtype,demux[demux_id].ECMpids[demux[demux_id].ECMpidcount].sflag); 347 demux[demux_id].ECMpidcount++; 348 } 349 348 350 } 349 351 … … 403 405 } 404 406 405 int dvbapi_get_descindex() {406 int i,j,idx=1,fail=1;407 while (fail) {408 fail=0;409 for (i=0;i<MAX_DEMUX;i++) {410 for (j=0;j<demux[i].ECMpidcount;j++) {411 if (demux[i].ECMpids[j].index==idx) {412 idx++;413 fail=1;414 break;415 }416 }417 }418 }419 cs_debug("descindex: %d", idx);420 return idx;421 }422 423 407 void dvbapi_set_pid(int demux_id, int num, int index) { 424 408 int i; … … 471 455 472 456 void dvbapi_start_descrambling(int demux_id) { 473 int j,k,i ;457 int j,k,i,l=2; 474 458 475 459 cs_log("Start descrambling PID #%d (CAID: %04X)", demux[demux_id].curindex, demux[demux_id].ECMpids[demux[demux_id].curindex].CAID); 476 460 477 461 i=demux[demux_id].curindex; 478 479 int streamcount=1;480 for (j=0; j<demux[demux_id].ECMpidcount; j++) {481 if (i != j && demux[demux_id].ECMpids[i].CAID == demux[demux_id].ECMpids[j].CAID && demux[demux_id].ECMpids[i].PROVID == demux[demux_id].ECMpids[j].PROVID) {482 cs_log("add filter #%d", ++streamcount);483 dvbapi_start_filter(demux_id, j, demux[demux_id].ECMpids[j].ECM_PID, 0x80, 0xF0, 3000, TYPE_ECM); //ECM484 demux[demux_id].ECMpids[j].index=dvbapi_get_descindex();485 demux[demux_id].ECMpids[j].checked=1;486 demux[demux_id].ECMpids[j].irdeto_curchid=demux[demux_id].ECMpids[i].irdeto_curchid;487 for (k=0; k<demux[demux_id].ECMpids[j].slen; k++)488 dvbapi_set_pid(demux_id, demux[demux_id].ECMpids[j].stream[k], demux[demux_id].ECMpids[j].index-1);489 }490 }491 492 462 demux[demux_id].pidindex=i; 493 demux[demux_id].ECMpids[i].index = dvbapi_get_descindex(); 494 if (streamcount<=1) { 495 for (k=0;k<demux[demux_id].STREAMpidcount;k++) 496 dvbapi_set_pid(demux_id, k, demux[demux_id].ECMpids[i].index-1); 497 } else { 498 demux[demux_id].ECMpids[i].index = dvbapi_get_descindex(); 499 for (k=0; k<demux[demux_id].ECMpids[i].slen; k++) { 500 dvbapi_set_pid(demux_id, demux[demux_id].ECMpids[i].stream[k], demux[demux_id].ECMpids[i].index-1); 501 } 502 } 503 463 if (demux[demux_id].ECMpids[i].sflag == 0) 464 { 465 for (k=0;k<demux[demux_id].STREAMpidcount;k++) dvbapi_set_pid(demux_id, k, demux_id*2+demux[demux_id].ECMpids[i].checked-1); 466 cs_debug("SET FOR PID %#x %d %d", demux[demux_id].ECMpids[i].ECM_PID,demux[demux_id].ECMpids[i].sflag,k); 467 } else 468 for (j=0; j<demux[demux_id].ECMpidcount; j++) 469 if (demux[demux_id].ECMpids[i].CAID == demux[demux_id].ECMpids[j].CAID && demux[demux_id].ECMpids[i].PROVID == demux[demux_id].ECMpids[j].PROVID ) 470 { 471 if (i!=j) 472 { 473 dvbapi_start_filter(demux_id, j, demux[demux_id].ECMpids[j].ECM_PID, 0x80, 0xF0, 3000, TYPE_ECM); //ECM 474 demux[demux_id].ECMpids[j].checked=l++; 475 if (l>3) 476 { 477 cs_log("Triple ECM %#x",demux[demux_id].ECMpids[j].sflag); 478 break; 479 } 480 } 481 for (k=0; k<demux[demux_id].ECMpids[j].slen; k++) dvbapi_set_pid(demux_id, demux[demux_id].ECMpids[j].stream[k], demux_id*2+demux[demux_id].ECMpids[j].checked-1); 482 cs_debug("SET FOR PID %#x %d %d", demux[demux_id].ECMpids[j].ECM_PID,demux[demux_id].ECMpids[j].sflag,k); 483 } 484 485 504 486 if (cfg->dvbapi_au==1) 505 487 dvbapi_start_filter(demux_id, demux[demux_id].pidindex, 0x001, 0x01, 0xFF, 0, TYPE_EMM); //CAT … … 876 858 877 859 878 void dvbapi_parse_descriptor(int demux_id, unsigned int info_length, unsigned char *buffer ) {860 void dvbapi_parse_descriptor(int demux_id, unsigned int info_length, unsigned char *buffer, unsigned char streamtype) { 879 861 //int ca_pmt_cmd_id = buffer[i + 5]; 880 862 unsigned int descriptor_length=0; … … 906 888 descriptor_ca_pid = ((buffer[j+2+u] & 0x1F) << 8) | buffer[j+2+u+1]; 907 889 descriptor_ca_provider = (buffer[j+2+u+2] << 8) | buffer[j+2+u+3]; 908 dvbapi_add_ecmpid(demux_id, descriptor_ca_system_id, descriptor_ca_pid, descriptor_ca_provider, 0);890 dvbapi_add_ecmpid(demux_id, descriptor_ca_system_id, descriptor_ca_pid, descriptor_ca_provider, streamtype); 909 891 } 910 892 } else { … … 915 897 descriptor_ca_provider = buffer[j+6] << 16 | (buffer[j+7] << 8| (buffer[j+8])); 916 898 917 dvbapi_add_ecmpid(demux_id, descriptor_ca_system_id, descriptor_ca_pid, descriptor_ca_provider, 0);899 dvbapi_add_ecmpid(demux_id, descriptor_ca_system_id, descriptor_ca_pid, descriptor_ca_provider, streamtype); 918 900 } 919 901 } … … 1037 1019 1038 1020 if (program_info_length > 1 && program_info_length < length) 1039 dvbapi_parse_descriptor(demux_id, program_info_length-1, buffer+7 );1021 dvbapi_parse_descriptor(demux_id, program_info_length-1, buffer+7, 0); 1040 1022 1041 1023 unsigned int es_info_length=0; … … 1053 1035 1054 1036 if (es_info_length != 0 && es_info_length < length) { 1055 dvbapi_parse_descriptor(demux_id, es_info_length, buffer+i+5 );1037 dvbapi_parse_descriptor(demux_id, es_info_length, buffer+i+5, (unsigned char)stream_type); 1056 1038 } 1057 1039 } … … 1643 1625 return; 1644 1626 #endif 1645 int i ;1627 int i,j; 1646 1628 1647 1629 for (i=0;i<MAX_DEMUX;i++) { … … 1679 1661 } 1680 1662 1681 int j=0; 1682 for (j=0; j<demux[i].ECMpidcount; j++) 1683 if (demux[i].ECMpids[j].CAID == er->caid && demux[i].ECMpids[j].ECM_PID == er->pid) 1684 break; 1685 if (j==demux[i].ECMpidcount) continue; 1663 j=demux[i].pidindex; 1664 if (demux[i].ECMpids[j].CAID != er->caid || demux[i].ECMpids[j].ECM_PID != er->pid) 1665 { 1666 for (j=0; j<demux[i].ECMpidcount; j++) if (demux[i].ECMpids[j].CAID == er->caid && demux[i].ECMpids[j].ECM_PID == er->pid) break; 1667 if (j==demux[i].ECMpidcount) continue; 1668 } 1686 1669 1687 1670 #ifdef WITH_STAPI 1688 1671 stapi_write_cw(i, er->cw); 1689 1672 #else 1690 dvbapi_write_cw(i, er->cw, demux[i].ECMpids[j].index-1);1673 dvbapi_write_cw(i, er->cw, i*2+demux[i].ECMpids[j].checked-1); 1691 1674 #endif 1692 1675 // reset idle-Time -
branches/dvbapi-experimental/module-dvbapi.h
r3524 r3531 50 50 int status; 51 51 unsigned char table; 52 int index;52 unsigned char sflag; 53 53 unsigned char slen; 54 54 char stream[8];
Note:
See TracChangeset
for help on using the changeset viewer.