Changeset 11527
- Timestamp:
- 06/29/19 17:14:41 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-dvbapi.c
r11526 r11527 3610 3610 } 3611 3611 3612 static void dvbapi_priority_read_entry_add(int32_t demux_id, uint16_t video_pid) 3613 { 3614 struct s_dvbapi_priority *add_entry; 3615 3616 for(add_entry = dvbapi_priority; add_entry != NULL; add_entry = add_entry->next) 3617 { 3618 // ECM pid is misused to hold PMT pid in case of 'A' rule. 3619 // Some receivers don't forward the PMT pid, so use the video pid instead 3620 if(add_entry->type != 'a' || add_entry->srvid != demux[demux_id].program_number 3621 || (add_entry->ecmpid && demux[demux_id].pmtpid && add_entry->ecmpid != demux[demux_id].pmtpid) 3622 || (add_entry->ecmpid && !demux[demux_id].pmtpid && add_entry->ecmpid != video_pid)) 3623 { 3624 continue; 3625 } 3626 3627 dvbapi_add_ecmpid(demux_id, add_entry->mapcaid, add_entry->mapecmpid, add_entry->mapprovid, 0, "(fake ecm pid)"); 3628 3629 cs_log_dbg(D_DVBAPI, "Demuxer %d added fake ecm pid %04X@%06X:%04X for program %04X", demux_id, 3630 add_entry->mapcaid, add_entry->mapprovid, add_entry->mapecmpid, demux[demux_id].program_number); 3631 break; 3632 } 3633 } 3634 3635 static void dvbapi_priority_read_entry_map(int32_t demux_id) 3636 { 3637 int32_t j; 3638 struct s_dvbapi_priority *map_entry; 3639 3640 for(j = 0; j < demux[demux_id].ECMpidcount; j++) 3641 { 3642 map_entry = dvbapi_check_prio_match(demux_id, j, 'm'); 3643 if(map_entry) 3644 { 3645 cs_log_dbg(D_DVBAPI, "Demuxer %d mapping ecm pid %d from %04X@%06X to %04X@%06X", 3646 demux_id, j, demux[demux_id].ECMpids[j].CAID, demux[demux_id].ECMpids[j].PROVID, 3647 map_entry->mapcaid, map_entry->mapprovid); 3648 3649 demux[demux_id].ECMpids[j].CAID = map_entry->mapcaid; 3650 demux[demux_id].ECMpids[j].PROVID = map_entry->mapprovid; 3651 } 3652 } 3653 } 3654 3655 static void dvbapi_priority_read_entry_extra(int32_t demux_id) 3656 { 3657 struct s_dvbapi_priority *extra_entry; 3658 int32_t j, k, l, m, extra_demux_id; 3659 3660 for(extra_entry = dvbapi_priority; extra_entry != NULL; extra_entry = extra_entry->next) 3661 { 3662 if(extra_entry->type != 'x') 3663 { 3664 continue; 3665 } 3666 3667 for(j = 0; j <= demux[demux_id].ECMpidcount; ++j) 3668 { 3669 if((extra_entry->caid && extra_entry->caid != demux[demux_id].ECMpids[j].CAID) 3670 || (extra_entry->provid && extra_entry->provid != demux[demux_id].ECMpids[j].PROVID) 3671 || (extra_entry->ecmpid && extra_entry->ecmpid != demux[demux_id].ECMpids[j].ECM_PID) 3672 || (extra_entry->srvid && extra_entry->srvid != demux[demux_id].program_number)) 3673 { 3674 continue; 3675 } 3676 3677 cs_log("Mapping ecm pid %04X@%06X:%04X:%04X to extra demuxer", 3678 extra_entry->caid, extra_entry->provid, extra_entry->ecmpid, extra_entry->srvid); 3679 3680 for(extra_demux_id = 0; extra_demux_id < MAX_DEMUX; extra_demux_id++) 3681 { 3682 if(demux[extra_demux_id].program_number != 0) 3683 { 3684 continue; // Skip occupied demuxers 3685 } 3686 } 3687 3688 if(extra_demux_id >= MAX_DEMUX) 3689 { 3690 cs_log("There is no free demuxer for extra streams"); 3691 continue; 3692 } 3693 3694 demux[extra_demux_id].ECMpids[0] = demux[demux_id].ECMpids[j]; 3695 demux[extra_demux_id].ECMpidcount = 1; 3696 demux[extra_demux_id].STREAMpidcount = 0; 3697 demux[extra_demux_id].program_number = demux[demux_id].program_number; 3698 demux[extra_demux_id].pmtpid = demux[demux_id].pmtpid; 3699 demux[extra_demux_id].demux_index = demux[demux_id].demux_index; 3700 demux[extra_demux_id].adapter_index = demux[demux_id].adapter_index; 3701 demux[extra_demux_id].ca_mask = demux[demux_id].ca_mask; 3702 demux[extra_demux_id].socket_fd = demux[demux_id].socket_fd; 3703 demux[extra_demux_id].stopdescramble = 0; 3704 demux[extra_demux_id].rdr = NULL; 3705 demux[extra_demux_id].curindex = -1; 3706 3707 // Add streams to extra demux 3708 for(k = 0; k < demux[demux_id].STREAMpidcount; ++k) 3709 { 3710 if(!demux[demux_id].ECMpids[j].streams || (demux[demux_id].ECMpids[j].streams & (1 << k))) 3711 { 3712 demux[extra_demux_id].ECMpids[0].streams |= (1 << demux[extra_demux_id].STREAMpidcount); 3713 demux[extra_demux_id].STREAMpids[demux[extra_demux_id].STREAMpidcount] = demux[demux_id].STREAMpids[k]; 3714 demux[extra_demux_id].STREAMpidsType[demux[extra_demux_id].STREAMpidcount] = demux[demux_id].STREAMpidsType[k]; 3715 ++demux[extra_demux_id].STREAMpidcount; 3716 3717 // Shift stream associations in normal demux because we will remove the stream entirely 3718 for(l = 0; l < demux[demux_id].ECMpidcount; ++l) 3719 { 3720 for(m = k; m < demux[demux_id].STREAMpidcount - 1; ++m) 3721 { 3722 if(demux[demux_id].ECMpids[l].streams & (1 << (m + 1))) 3723 { 3724 demux[demux_id].ECMpids[l].streams |= (1 << m); 3725 } 3726 else 3727 { 3728 demux[demux_id].ECMpids[l].streams &= ~(1 << m); 3729 } 3730 } 3731 } 3732 3733 // Remove stream association from normal demux device 3734 for(l = k; l < demux[demux_id].STREAMpidcount - 1; ++l) 3735 { 3736 demux[demux_id].STREAMpids[l] = demux[demux_id].STREAMpids[l + 1]; 3737 demux[demux_id].STREAMpidsType[l] = demux[demux_id].STREAMpidsType[l + 1]; 3738 } 3739 3740 --demux[demux_id].STREAMpidcount; 3741 --k; 3742 } 3743 } 3744 3745 // Remove ecm pid from normal demuxer 3746 for(k = j; k < demux[demux_id].ECMpidcount; ++k) 3747 { 3748 demux[demux_id].ECMpids[k] = demux[demux_id].ECMpids[k + 1]; 3749 } 3750 3751 --demux[demux_id].ECMpidcount; 3752 --j; 3753 3754 if(demux[extra_demux_id].STREAMpidcount <= 0) 3755 { 3756 cs_log("Found no streams for extra demuxer. Not starting additional decoding on it."); 3757 3758 demux[extra_demux_id].program_number = 0; 3759 demux[extra_demux_id].stopdescramble = 1; 3760 } 3761 3762 if(demux[demux_id].STREAMpidcount < 1) 3763 { 3764 cs_log("Found no streams for normal demuxer. Not starting additional decoding on it."); 3765 } 3766 } 3767 } 3768 } 3769 3612 3770 void dvbapi_parse_descriptors(int32_t demux_id, uint32_t info_length, uint8_t *buffer, uint8_t *type) 3613 3771 { … … 3772 3930 if(dvbapi_priority) 3773 3931 { 3774 struct s_dvbapi_priority *mapentry; 3775 for(j = 0; (int32_t)j < demux[demux_id].ECMpidcount; j++) 3776 { 3777 mapentry = dvbapi_check_prio_match(demux_id, j, 'm'); 3778 if(mapentry) 3779 { 3780 cs_log_dbg(D_DVBAPI, "Demuxer %d mapping ecmpid %d from %04X@%06X to %04X@%06X", 3781 demux_id, 3782 j, 3783 demux[demux_id].ECMpids[j].CAID, 3784 demux[demux_id].ECMpids[j].PROVID, 3785 mapentry->mapcaid, mapentry->mapprovid); 3786 3787 demux[demux_id].ECMpids[j].CAID = mapentry->mapcaid; 3788 demux[demux_id].ECMpids[j].PROVID = mapentry->mapprovid; 3789 } 3790 } 3932 dvbapi_priority_read_entry_map(demux_id); 3791 3933 } 3792 3934 } … … 4223 4365 } 4224 4366 uint32_t es_info_length = 0, vpid = 0; 4225 struct s_dvbapi_priority *addentry;4226 4367 4227 4368 for(i = program_info_length + program_info_start; i + 4 < length; i += es_info_length + 5) … … 4242 4383 else 4243 4384 { 4244 for(addentry = dvbapi_priority; addentry != NULL; addentry = addentry->next) 4245 { 4246 if(addentry->type != 'a' 4247 || (addentry->ecmpid && pmtpid && addentry->ecmpid != pmtpid) // ecmpid is misused to hold pmtpid in case of A: rule 4248 || (addentry->ecmpid && !pmtpid && addentry->ecmpid != vpid) // some receivers don't forward pmtpid, use vpid instead 4249 || (addentry->srvid != demux[demux_id].program_number)) 4250 { 4251 continue; 4252 } 4253 4254 cs_log_dbg(D_DVBAPI, "Demuxer %d fake ecmpid %04X@%06X:%04x for unencrypted stream on srvid %04X", 4255 demux_id, 4256 addentry->mapcaid, 4257 addentry->mapprovid, 4258 addentry->mapecmpid, 4259 demux[demux_id].program_number); 4260 dvbapi_add_ecmpid(demux_id, addentry->mapcaid, addentry->mapecmpid, addentry->mapprovid, 0, " (fake ecmpid)"); 4261 break; 4262 } 4385 dvbapi_priority_read_entry_add(demux_id, vpid); 4263 4386 } 4264 4387 … … 4375 4498 4376 4499 dvbapi_capmt_notify(&demux[demux_id]); 4377 struct s_dvbapi_priority *xtraentry; 4378 int32_t k, l, m, xtra_demux_id; 4379 4380 for(xtraentry = dvbapi_priority; xtraentry != NULL; xtraentry = xtraentry->next) 4381 { 4382 if(xtraentry->type != 'x') 4383 { 4384 continue; 4385 } 4386 4387 for(j = 0; j <= demux[demux_id].ECMpidcount; ++j) 4388 { 4389 if((xtraentry->caid && xtraentry->caid != demux[demux_id].ECMpids[j].CAID) 4390 || (xtraentry->provid && xtraentry->provid != demux[demux_id].ECMpids[j].PROVID) 4391 || (xtraentry->ecmpid && xtraentry->ecmpid != demux[demux_id].ECMpids[j].ECM_PID) 4392 || (xtraentry->srvid && xtraentry->srvid != demux[demux_id].program_number)) 4393 { 4394 continue; 4395 } 4396 4397 cs_log("Mapping ecmpid %04X@%06X:%04X:%04X to xtra demuxer/ca-devices", 4398 xtraentry->caid, xtraentry->provid, xtraentry->ecmpid, xtraentry->srvid); 4399 4400 for(xtra_demux_id = 0; xtra_demux_id < MAX_DEMUX && demux[xtra_demux_id].program_number > 0; xtra_demux_id++){ ; } 4401 4402 if(xtra_demux_id >= MAX_DEMUX) 4403 { 4404 cs_log("Found no free demux device for extra streams"); 4405 continue; 4406 } 4407 4408 // copy to new demuxer 4409 if(!is_real_pmt) 4410 { 4411 get_demux_options(demux_id, buffer, &ca_mask, &demux_index, &adapter_index, &pmtpid); 4412 } 4413 4414 demux[xtra_demux_id].ECMpids[0] = demux[demux_id].ECMpids[j]; 4415 demux[xtra_demux_id].ECMpidcount = 1; 4416 demux[xtra_demux_id].STREAMpidcount = 0; 4417 demux[xtra_demux_id].program_number = demux[demux_id].program_number; 4418 demux[xtra_demux_id].pmtpid = demux[demux_id].pmtpid; 4419 demux[xtra_demux_id].demux_index = demux_index; 4420 demux[xtra_demux_id].adapter_index = adapter_index; 4421 demux[xtra_demux_id].ca_mask = ca_mask; 4422 demux[xtra_demux_id].socket_fd = connfd; 4423 demux[xtra_demux_id].stopdescramble = 0; // remove deletion mark! 4424 demux[xtra_demux_id].rdr = NULL; 4425 demux[xtra_demux_id].curindex = -1; 4426 4427 // add streams to xtra demux 4428 for(k = 0; k < demux[demux_id].STREAMpidcount; ++k) 4429 { 4430 if(!demux[demux_id].ECMpids[j].streams || (demux[demux_id].ECMpids[j].streams & (1 << k))) 4431 { 4432 demux[xtra_demux_id].ECMpids[0].streams |= (1 << demux[xtra_demux_id].STREAMpidcount); 4433 demux[xtra_demux_id].STREAMpids[demux[xtra_demux_id].STREAMpidcount] = demux[demux_id].STREAMpids[k]; 4434 demux[xtra_demux_id].STREAMpidsType[demux[xtra_demux_id].STREAMpidcount] = demux[demux_id].STREAMpidsType[k]; 4435 ++demux[xtra_demux_id].STREAMpidcount; 4436 4437 // shift stream associations in normal demux because we will remove the stream entirely 4438 for(l = 0; l < demux[demux_id].ECMpidcount; ++l) 4439 { 4440 for(m = k; m < demux[demux_id].STREAMpidcount - 1; ++m) 4441 { 4442 if(demux[demux_id].ECMpids[l].streams & (1 << (m + 1))) 4443 { 4444 demux[demux_id].ECMpids[l].streams |= (1 << m); 4445 } 4446 else 4447 { 4448 demux[demux_id].ECMpids[l].streams &= ~(1 << m); 4449 } 4450 } 4451 } 4452 4453 // remove stream association from normal demux device 4454 for(l = k; l < demux[demux_id].STREAMpidcount - 1; ++l) 4455 { 4456 demux[demux_id].STREAMpids[l] = demux[demux_id].STREAMpids[l + 1]; 4457 demux[demux_id].STREAMpidsType[l] = demux[demux_id].STREAMpidsType[l + 1]; 4458 } 4459 --demux[demux_id].STREAMpidcount; 4460 --k; 4461 } 4462 } 4463 4464 // remove ecmpid from normal demuxer 4465 for(k = j; k < demux[demux_id].ECMpidcount; ++k) 4466 { 4467 demux[demux_id].ECMpids[k] = demux[demux_id].ECMpids[k + 1]; 4468 } 4469 --demux[demux_id].ECMpidcount; 4470 --j; 4471 4472 if(demux[xtra_demux_id].STREAMpidcount <= 0) 4473 { 4474 cs_log("Found no streams for extra demuxer. Not starting additional decoding on it."); 4475 demux[xtra_demux_id].program_number = 0; 4476 demux[xtra_demux_id].stopdescramble = 1; 4477 } 4478 4479 if(demux[demux_id].STREAMpidcount < 1) 4480 { 4481 cs_log("Found no streams for normal demuxer. Not starting additional decoding on it."); 4482 } 4483 } 4484 } 4500 dvbapi_priority_read_entry_extra(demux_id); 4485 4501 4486 4502 if(start_descrambling)
Note:
See TracChangeset
for help on using the changeset viewer.