Changeset 11528 for trunk/module-dvbapi.c
- Timestamp:
- 06/29/19 17:53:35 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-dvbapi.c
r11527 r11528 3768 3768 } 3769 3769 3770 void dvbapi_parse_descriptors(int32_t demux_id, uint32_t info_length, uint8_t *buffer, uint8_t *type) 3770 static 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 3828 static void dvbapi_parse_pmt_descriptors(int32_t demux_id, uint8_t *buffer, uint16_t length, uint8_t *type) 3771 3829 { 3772 3830 // int32_t ca_pmt_cmd_id = buffer[i + 5]; 3773 3831 uint8_t descriptor_tag = buffer[0], descriptor_length = 0; 3774 3832 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) 3786 3836 { 3787 3837 return; … … 3790 3840 // skip descriptors with tag 0x00 and 0x01, 3791 3841 // 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) 3793 3843 { 3794 3844 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]; 3802 3852 3803 3853 cs_log_dbg(D_DVBAPI, "Demuxer %d found %s descriptor (tag: %02X length: %02X)", … … 3806 3856 switch(descriptor_tag) 3807 3857 { 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) 3813 3871 { 3814 3872 *type = STREAM_AUDIO; … … 3821 3879 case 0x09: // CA descriptor 3822 3880 { 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); 3866 3882 break; 3867 3883 } 3868 3884 3869 case 0x59: // subtitling descriptor (DVB)3885 case 0x59: // Subtitling descriptor (DVB) 3870 3886 { 3871 3887 *type = STREAM_SUBTITLE; … … 3874 3890 3875 3891 case 0x6A: // AC-3 descriptor (DVB) 3876 case 0x7A: // enhanced AC-3 descriptor (DVB)3892 case 0x7A: // Enhanced AC-3 descriptor (DVB) 3877 3893 case 0x7B: // DTS descriptor (DVB) 3878 3894 case 0x7C: // AAC descriptor (DVB) … … 3882 3898 } 3883 3899 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]; 3887 3903 3888 3904 cs_log_dbg(D_DVBAPI, "Demuxer %d found %s descriptor (extension tag: %02X)", … … 3908 3924 if(descriptor_length == 8) // private descriptor of length 8, assume enigma/tvh 3909 3925 { 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); 3913 3929 cs_log_dbg(D_DVBAPI, "Demuxer %d assuming enigma private descriptor (namespace: %08X tsid: %04X onid: %04X)", 3914 3930 demux_id, demux[demux_id].ens, demux[demux_id].tsid, demux[demux_id].onid); … … 4362 4378 if(program_info_length > 1 && program_info_length < length) // parse program descriptors 4363 4379 { 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); 4365 4381 } 4366 4382 uint32_t es_info_length = 0, vpid = 0; … … 4379 4395 if(es_info_length != 0 && es_info_length < length) // parse program element descriptors 4380 4396 { 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); 4382 4398 } 4383 4399 else
Note:
See TracChangeset
for help on using the changeset viewer.