Changeset 11528


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

[dvbapi] Moved parsing of CA descriptor to a separate function

This is necessary for the upcoming changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/module-dvbapi.c

    r11527 r11528  
    37683768}
    37693769
    3770 void dvbapi_parse_descriptors(int32_t demux_id, uint32_t info_length, uint8_t *buffer, uint8_t *type)
     3770static void dvbapi_parse_ca_descriptor(int32_t demux_id, uint8_t *buffer, uint8_t descriptor_length)
     3771{
     3772    uint16_t i, ca_system_id, ca_pid;
     3773    uint32_t ca_provider = 0, ca_data = 0;
     3774    char txt[40]; // room for PBM: 8 byte pbm and DATE: date
     3775    memset(txt, 0x00, sizeof(txt));
     3776
     3777    if(descriptor_length < 4)
     3778    {
     3779        return; // CA descriptor has a minimum length of 4 bytes
     3780    }
     3781
     3782    ca_system_id = b2i(2, buffer);
     3783    ca_pid = b2i(2, buffer + 2) & 0x1FFF;
     3784
     3785    if(caid_is_seca(ca_system_id))
     3786    {
     3787        for(i = 2; i < descriptor_length; i += 15)
     3788        {
     3789            ca_pid = b2i(2, buffer + i) & 0x1FFF;
     3790            ca_provider = b2i(2, buffer + i + 2);
     3791
     3792            int8_t year = buffer[i + 13] >> 1;
     3793            int8_t month = (((buffer[i + 13] & 0x01) << 3) | (buffer[i + 14] >> 5));
     3794            int8_t day = buffer[i + 14] & 0x1F;
     3795
     3796            snprintf(txt, sizeof(txt), "PBM: ");
     3797            cs_hexdump(0, buffer + i + 5, 8, txt + 5, (2 * 8) + 1); // hexdump 8 byte pbm
     3798            snprintf(txt + 20, sizeof(txt) - 20, " DATE: %d-%d-%d", day, month, year + 1990);
     3799
     3800            dvbapi_add_ecmpid(demux_id, ca_system_id, ca_pid, ca_provider, 0, txt);
     3801        }
     3802    }
     3803    else
     3804    {
     3805        if(caid_is_viaccess(ca_system_id) && descriptor_length == 0x0F && buffer[10] == 0x14)
     3806        {
     3807            ca_provider = b2i(3, buffer + 12) & 0xFFFFF0;
     3808        }
     3809        else if(caid_is_nagra(ca_system_id) && descriptor_length == 0x07)
     3810        {
     3811            ca_provider = b2i(2, buffer + 5);
     3812        }
     3813        else if((ca_system_id >> 8 == 0x4A || ca_system_id == 0x2710) && descriptor_length > 0x04)
     3814        {
     3815            ca_provider = buffer[4];
     3816
     3817            if(caid_is_dre(ca_system_id) && descriptor_length == 0x0A)
     3818            {
     3819                ca_data = b2i(4, buffer + 6);
     3820                snprintf(txt, 40, "CA DATA: %X", ca_data);
     3821            }
     3822        }
     3823
     3824        dvbapi_add_ecmpid(demux_id, ca_system_id, ca_pid, ca_provider, ca_data, txt);
     3825    }
     3826}
     3827
     3828static void dvbapi_parse_pmt_descriptors(int32_t demux_id, uint8_t *buffer, uint16_t length, uint8_t *type)
    37713829{
    37723830    // int32_t ca_pmt_cmd_id = buffer[i + 5];
    37733831    uint8_t descriptor_tag = buffer[0], descriptor_length = 0;
    37743832    uint8_t skip_border = cfg.dvbapi_boxtype == BOXTYPE_SAMYGO ? 0x05 : 0x02; // skip input values <0x05 on samygo
    3775     uint32_t j, u, k;
    3776 
    3777     static const char format_identifiers_audio[10][5] =
    3778     {
    3779         // "HDMV" format identifier is removed
    3780         // OSCam does not need to know about Blu-ray
    3781         "AC-3", "BSSD", "dmat", "DRA1", "DTS1",
    3782         "DTS2", "DTS3", "EAC3", "mlpa", "Opus",
    3783     };
    3784 
    3785     if(info_length < 1)
     3833    uint16_t i, j;
     3834
     3835    if(length < 1)
    37863836    {
    37873837        return;
     
    37903840    // skip descriptors with tag 0x00 and 0x01,
    37913841    // or even greater for samygo (not sure why we do this...)
    3792     if((descriptor_tag < skip_border) && info_length > 0)
     3842    if((descriptor_tag < skip_border) && length > 0)
    37933843    {
    37943844        buffer++;
    3795         info_length--;
    3796     }
    3797 
    3798     for(j = 0; j + 1 < info_length; j += descriptor_length + 2)
    3799     {
    3800         descriptor_tag = buffer[j];
    3801         descriptor_length = buffer[j + 1];
     3845        length--;
     3846    }
     3847
     3848    for(i = 0; i + 1 < length; i += 2 + descriptor_length)
     3849    {
     3850        descriptor_tag = buffer[i];
     3851        descriptor_length = buffer[i + 1];
    38023852
    38033853        cs_log_dbg(D_DVBAPI, "Demuxer %d found %s descriptor (tag: %02X length: %02X)",
     
    38063856        switch(descriptor_tag)
    38073857        {
    3808             case 0x05: // registration descriptor
    3809             {
    3810                 for(k = 0; k < 10; k++)
    3811                 {
    3812                     if(memcmp(buffer + j + 2, format_identifiers_audio[k], 4) == 0)
     3858            case 0x05: // Registration descriptor
     3859            {
     3860                // "HDMV" format identifier is removed
     3861                // OSCam does not need to know about Blu-ray
     3862                const char format_identifiers_audio[10][5] =
     3863                {
     3864                    "AC-3", "BSSD", "dmat", "DRA1", "DTS1",
     3865                    "DTS2", "DTS3", "EAC3", "mlpa", "Opus",
     3866                };
     3867
     3868                for(j = 0; j < 10; j++)
     3869                {
     3870                    if(memcmp(buffer + i + 2, format_identifiers_audio[j], 4) == 0)
    38133871                    {
    38143872                        *type = STREAM_AUDIO;
     
    38213879            case 0x09: // CA descriptor
    38223880            {
    3823                 int32_t descriptor_ca_system_id = b2i(2, buffer + j + 2);
    3824                 int32_t descriptor_ca_pid = b2i(2, buffer + j + 4) & 0x1FFF;
    3825                 int32_t descriptor_ca_provider = 0;
    3826                 uint32_t descriptor_ca_data = 0;
    3827                 char txt[40]; // room for PBM: 8 byte pbm and DATE: date
    3828                 memset(txt, 0x00, sizeof(txt));
    3829 
    3830                 if(descriptor_ca_system_id >> 8 == 0x01)
    3831                 {
    3832                     for(u = 2; u < descriptor_length; u += 15)
    3833                     {
    3834                         descriptor_ca_pid = b2i(2, buffer + j + u + 2) & 0x1FFF;
    3835                         descriptor_ca_provider = b2i(2, buffer + j + u + 4);
    3836                         int8_t year = buffer[j + u + 15] >> 1;
    3837                         int8_t month = (((buffer[j + u + 15] & 0x01) << 3) | (buffer[j + u + 16] >> 5));
    3838                         int8_t day = buffer[j + u + 16] & 0x1F;
    3839                         snprintf(txt, sizeof(txt), "PBM: ");
    3840                         cs_hexdump(0, buffer + j + u + 7, 8, txt + 5, (2 * 8) + 1); // hexdump 8 byte pbm
    3841                         snprintf(txt + 20, sizeof(txt) - 20, " DATE: %d-%d-%d", day, month, year + 1990);
    3842                         dvbapi_add_ecmpid(demux_id, descriptor_ca_system_id, descriptor_ca_pid, descriptor_ca_provider, 0, txt);
    3843                     }
    3844                 }
    3845                 else
    3846                 {
    3847                     if(caid_is_viaccess(descriptor_ca_system_id) && descriptor_length == 0x0F && buffer[j + 12] == 0x14)
    3848                     {
    3849                         descriptor_ca_provider = b2i(3, buffer + j + 14) & 0xFFFFF0;
    3850                     }
    3851                     else if(caid_is_nagra(descriptor_ca_system_id) && descriptor_length == 0x07)
    3852                     {
    3853                         descriptor_ca_provider = b2i(2, buffer + j + 7);
    3854                     }
    3855                     else if((descriptor_ca_system_id >> 8 == 0x4A || descriptor_ca_system_id == 0x2710) && descriptor_length > 0x04)
    3856                     {
    3857                         descriptor_ca_provider = buffer[j + 6];
    3858                         if(caid_is_dre(descriptor_ca_system_id) && descriptor_length == 0xA)
    3859                         {
    3860                             descriptor_ca_data = b2i(4, buffer + j + 8);
    3861                             snprintf(txt, 40, "CA DATA: %X", descriptor_ca_data);
    3862                         }
    3863                     }
    3864                     dvbapi_add_ecmpid(demux_id, descriptor_ca_system_id, descriptor_ca_pid, descriptor_ca_provider, descriptor_ca_data, txt);
    3865                 }
     3881                dvbapi_parse_ca_descriptor(demux_id, buffer + i + 2, descriptor_length);
    38663882                break;
    38673883            }
    38683884
    3869             case 0x59: // subtitling descriptor (DVB)
     3885            case 0x59: // Subtitling descriptor (DVB)
    38703886            {
    38713887                *type = STREAM_SUBTITLE;
     
    38743890
    38753891            case 0x6A: // AC-3 descriptor (DVB)
    3876             case 0x7A: // enhanced AC-3 descriptor (DVB)
     3892            case 0x7A: // Enhanced AC-3 descriptor (DVB)
    38773893            case 0x7B: // DTS descriptor (DVB)
    38783894            case 0x7C: // AAC descriptor (DVB)
     
    38823898            }
    38833899
    3884             case 0x7F: // extension descriptor (DVB)
    3885             {
    3886                 uint8_t extension_descriptor_tag = buffer[j + 2];
     3900            case 0x7F: // Extension descriptor (DVB)
     3901            {
     3902                uint8_t extension_descriptor_tag = buffer[i + 2];
    38873903
    38883904                cs_log_dbg(D_DVBAPI, "Demuxer %d found %s descriptor (extension tag: %02X)",
     
    39083924                if(descriptor_length == 8) // private descriptor of length 8, assume enigma/tvh
    39093925                {
    3910                     demux[demux_id].ens  = b2i(4, buffer + j + 2);
    3911                     demux[demux_id].tsid = b2i(2, buffer + j + 6);
    3912                     demux[demux_id].onid = b2i(2, buffer + j + 8);
     3926                    demux[demux_id].ens  = b2i(4, buffer + i + 2);
     3927                    demux[demux_id].tsid = b2i(2, buffer + i + 6);
     3928                    demux[demux_id].onid = b2i(2, buffer + i + 8);
    39133929                    cs_log_dbg(D_DVBAPI, "Demuxer %d assuming enigma private descriptor (namespace: %08X tsid: %04X onid: %04X)",
    39143930                            demux_id, demux[demux_id].ens, demux[demux_id].tsid, demux[demux_id].onid);
     
    43624378    if(program_info_length > 1 && program_info_length < length) // parse program descriptors
    43634379    {
    4364         dvbapi_parse_descriptors(demux_id, program_info_length, buffer + program_info_start, NULL);
     4380        dvbapi_parse_pmt_descriptors(demux_id, buffer + program_info_start, program_info_length, NULL);
    43654381    }
    43664382    uint32_t es_info_length = 0, vpid = 0;
     
    43794395            if(es_info_length != 0 && es_info_length < length) // parse program element descriptors
    43804396            {
    4381                 dvbapi_parse_descriptors(demux_id, es_info_length, buffer + i + 5, &type);
     4397                dvbapi_parse_pmt_descriptors(demux_id, buffer + i + 5, es_info_length, &type);
    43824398            }
    43834399            else
Note: See TracChangeset for help on using the changeset viewer.