Changeset 11527


Ignore:
Timestamp:
06/29/19 17:14:41 (14 months ago)
Author:
nautilus7
Message:

[dvbapi] Moved reading of priority entries in separate functions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/module-dvbapi.c

    r11526 r11527  
    36103610}
    36113611
     3612static 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
     3635static 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
     3655static 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
    36123770void dvbapi_parse_descriptors(int32_t demux_id, uint32_t info_length, uint8_t *buffer, uint8_t *type)
    36133771{
     
    37723930    if(dvbapi_priority)
    37733931    {
    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);
    37913933    }
    37923934}
     
    42234365    }
    42244366    uint32_t es_info_length = 0, vpid = 0;
    4225     struct s_dvbapi_priority *addentry;
    42264367
    42274368    for(i = program_info_length + program_info_start; i + 4 < length; i += es_info_length + 5)
     
    42424383            else
    42434384            {
    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);
    42634386            }
    42644387
     
    43754498
    43764499    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);
    44854501
    44864502    if(start_descrambling)
Note: See TracChangeset for help on using the changeset viewer.