- Timestamp:
- 06/02/19 13:45:14 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/module-dvbapi.c
r11518 r11520 3900 3900 uint16_t *demux_index, uint16_t *adapter_index, uint16_t *pmtpid) 3901 3901 { 3902 *ca_mask = 0x01, *demux_index = 0x00, *adapter_index = 0x00, *pmtpid = 0x00; 3903 3904 if(buffer[17] == 0x82 && buffer[18] == 0x02) 3905 { 3906 // enigma2 3907 *ca_mask = buffer[19]; 3908 uint32_t demuxid = buffer[20]; 3909 3910 if(demuxid == 0xff) 3911 { 3912 demuxid = 0; // tryfix prismcube (0xff -> "demux-1" = error!) 3913 } 3914 *demux_index = demuxid; 3915 3916 if(buffer[21] == 0x84 && buffer[22] == 0x02) 3917 { 3918 *pmtpid = b2i(2, buffer + 23); 3919 } 3920 3921 if(buffer[25] == 0x83 && buffer[26] == 0x01) 3922 { 3923 *adapter_index = buffer[27]; // from code cahandler.cpp 0x83 index of adapter 3924 } 3925 } 3926 3902 *ca_mask = 0x01; 3903 *demux_index = 0x00; 3904 *adapter_index = 0x00; 3905 *pmtpid = 0x00; 3906 3907 uint16_t program_info_length = b2i(2, buffer + 4) & 0x0FFF; 3908 uint16_t pos = 7; // 4 + 2 (program_info_length) + 1 (ca_pmt_cmd_id) 3909 3910 while(pos + 1 < program_info_length) 3911 { 3912 uint8_t descriptor_tag = buffer[pos]; 3913 uint8_t descriptor_length = buffer[pos + 1]; 3914 3915 switch(descriptor_tag) 3916 { 3917 case 0x09: // CA 3918 // We parse this descriptor elsewhere 3919 break; 3920 3921 case 0x81: // enigma namespace 3922 // We parse this in another function... 3923 // Maybe this is changed in the future 3924 break; 3925 3926 case 0x82: // demux, ca_mask, adapter (everyone is using this descriptor differently - what a mess) 3927 { 3928 if(descriptor_length == 0x02 && (cfg.dvbapi_boxtype == BOXTYPE_PC || 3929 cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX || cfg.dvbapi_boxtype == BOXTYPE_SAMYGO)) 3930 { 3931 *demux_index = buffer[pos + 2]; // it is always 0 but you never know 3932 *adapter_index = buffer[pos + 3]; // adapter index can be 0, 1, 2 3933 *ca_mask = (1 << *adapter_index); // use adapter_index as ca_mask 3934 } 3935 else if(descriptor_length == 0x03 && cfg.dvbapi_boxtype == BOXTYPE_QBOXHD) 3936 { 3937 // ca_mask = buffer[pos + 2]; // with STONE 1.0.4 always 0x01 3938 *demux_index = buffer[pos + 3]; // with STONE 1.0.4 always 0x00 3939 *adapter_index = buffer[pos + 4]; // with STONE 1.0.4 adapter index can be 0, 1, 2 3940 *ca_mask = (1 << *adapter_index); // use adapter_index as ca_mask 3941 } 3942 else if(descriptor_length == 0x02) // enigma2 3943 { 3944 *ca_mask = buffer[pos + 2]; 3945 uint8_t demux_tmp = buffer[pos + 3]; 3946 3947 if(demux_tmp >= 8 && *ca_mask == 0) // openpli based images 3948 { 3949 *ca_mask = 1 << demux_tmp; 3950 } 3951 3952 if(demux_tmp == 0xFF) // tryfix prismcube (0xFF -> "demux-1" = error!) 3953 { 3954 demux_tmp = 0; 3955 } 3956 *demux_index = demux_tmp; 3957 } 3958 break; 3959 } 3960 3961 case 0x83: // adapter 3962 { 3963 if(descriptor_length == 0x01) 3964 { 3965 *adapter_index = buffer[pos + 2]; 3966 } 3967 break; 3968 } 3969 3970 case 0x84: // pmt pid 3971 { 3972 if(descriptor_length == 0x02) 3973 { 3974 *pmtpid = b2i(2, buffer + pos + 2); 3975 } 3976 break; 3977 } 3978 3979 case 0x85: // service type mask (not used by OSCam) 3980 break; 3981 3982 case 0x86: // demux only (new - added in 2019) 3983 { 3984 if(descriptor_length == 0x01) 3985 { 3986 *demux_index = buffer[pos + 2]; 3987 *ca_mask = 1 << *demux_index; 3988 } 3989 break; 3990 } 3991 3992 default: 3993 { 3994 cs_log_dbg(D_DVBAPI, "Received unknown CA PMT descriptor (tag: %02X length: %02X)", 3995 descriptor_tag, descriptor_length); 3996 break; 3997 } 3998 } 3999 4000 pos += 2 + descriptor_length; 4001 } 4002 4003 // Probably this box doesn't send any private 4004 // descriptor in the CA PMT, so we have to improvise 3927 4005 if(cfg.dvbapi_boxtype == BOXTYPE_IPBOX_PMT) 3928 4006 { 3929 4007 *ca_mask = demux_id + 1; 3930 4008 *demux_index = demux_id; 3931 }3932 3933 if(cfg.dvbapi_boxtype == BOXTYPE_QBOXHD && buffer[17] == 0x82 && buffer[18] == 0x03)3934 {3935 // ca_mask = buffer[19]; // with STONE 1.0.4 always 0x013936 *demux_index = buffer[20]; // with STONE 1.0.4 always 0x003937 *adapter_index = buffer[21]; // with STONE 1.0.4 adapter index can be 0,1,23938 *ca_mask = (1 << *adapter_index); // use adapter_index as ca_mask (used as index for ca_fd[] array)3939 3940 if(buffer[21] == 0x84 && buffer[22] == 0x02)3941 {3942 *pmtpid = b2i(2, buffer + 23);3943 }3944 }3945 3946 if((cfg.dvbapi_boxtype == BOXTYPE_PC || cfg.dvbapi_boxtype == BOXTYPE_PC_NODMX || cfg.dvbapi_boxtype == BOXTYPE_SAMYGO)3947 && buffer[7] == 0x82 && buffer[8] == 0x02)3948 {3949 *demux_index = buffer[9]; // it is always 0 but you never know3950 *adapter_index = buffer[10]; // adapter index can be 0,1,23951 *ca_mask = (1 << *adapter_index); // use adapter_index as ca_mask (used as index for ca_fd[] array)3952 3953 if(buffer[21] == 0x84 && buffer[22] == 0x02)3954 {3955 *pmtpid = b2i(2, buffer + 23);3956 }3957 4009 } 3958 4010 }
Note:
See TracChangeset
for help on using the changeset viewer.