private void LoadDvbCT(ChannelList list, string path, string mappingName) { if (!ReadAndValidateChannellibFile(path, out var data, out var recordSize, out var recordCount)) { return; } var mapping = new DataMapping(this.ini.GetSection(mappingName)); mapping.SetDataPtr(data, chanLstBin.VersionMajor <= 11 ? 20 : 12); for (int i = 0; i < recordCount; i++, mapping.BaseOffset += recordSize) { var progNr = mapping.GetWord("offProgNr"); var offChannelName = mapping.BaseOffset + mapping.GetConst("offName", 0); var lenName = mapping.GetConst("lenName", 0); for (int j = 0; j < lenName; j += 2) { if (data[offChannelName + j] == 0) { lenName = j; break; } } string channelName = Encoding.Unicode.GetString(data, offChannelName, lenName); if (chanLstBin.VersionMajor <= 11) { var checksum = mapping.GetDword("offChecksum"); mapping.SetDword("offChecksum", 0); var crc = FaultyCrc32(data, mapping.BaseOffset + mapping.GetConst("offChecksum", 0), recordSize); if (crc != checksum) { throw new FileLoadException($"Invalid CRC in record {i} in {path}"); } } var ch = new Channel(list.SignalSource, i, progNr, channelName); ch.Id = mapping.GetWord("offId"); // only relevant for ChannelMap45 ch.FreqInMhz = (decimal)mapping.GetWord("offFreqTimes16") / 16; ch.OriginalNetworkId = mapping.GetWord("offOnid"); ch.TransportStreamId = mapping.GetWord("offTsid"); ch.ServiceId = mapping.GetWord("offSid"); ch.SymbolRate = (int)mapping.GetDword("offSymbolRate") / 1000; ch.Lock = mapping.GetByte("offLocked") != 0; ch.Favorites = mapping.GetByte("offIsFav") != 0 ? Favorites.A : 0; if (ch.Favorites != 0) { ch.OldFavIndex[0] = ch.OldProgramNr; } this.DataRoot.AddChannel(list, ch); } }
private ChannelInfo LoadDvbsChannel(ChannelList list, DataMapping mapping, int recordIndex, DvbStringDecoder dvbStringDecoder) { var transponderId = mapping.GetWord("offTransponderIndex"); var progNr = mapping.GetWord("offProgNr"); var ch = new ChannelInfo(list.SignalSource, recordIndex, progNr, null); // deleted channels must be kept in the list because their records must also be physically reordered when saving the list if (progNr == 0xFFFF || transponderId == 0xFFFF) { ch.IsDeleted = true; ch.OldProgramNr = -1; return(ch); } // onid, tsid, pcrpid and vpid can be 0 in some lists ch.PcrPid = mapping.GetWord("offPcrPid") & mapping.GetMask("maskPcrPid"); ch.Lock = mapping.GetFlag("Locked"); ch.OriginalNetworkId = mapping.GetWord("OffOnid"); ch.TransportStreamId = mapping.GetWord("offTsid"); ch.ServiceId = mapping.GetWord("offSid"); ch.VideoPid = mapping.GetWord("offVpid") & mapping.GetMask("maskVpid"); ch.Favorites = mapping.GetFlag("IsFav") ? Favorites.A : 0; ch.OldProgramNr = progNr; // the 0x1F as the first byte of the channel name is likely the DVB encoding indicator for UTF-8. So we use the DvbStringDecoder here dvbStringDecoder.GetChannelNames(mapping.Data, mapping.BaseOffset + mapping.GetConst("offName", 0), mapping.GetConst("lenName", 0), out var longName, out var shortName); ch.Name = longName.TrimEnd('\0'); ch.ShortName = shortName.TrimEnd('\0'); dvbStringDecoder.GetChannelNames(mapping.Data, mapping.BaseOffset + mapping.GetConst("offProvider", 0), mapping.GetConst("lenProvider", 0), out var provider, out _); ch.Provider = provider.TrimEnd('\0'); // copy values from the satellite/transponder tables to the channel if (this.DataRoot.Transponder.TryGetValue(transponderId, out var t)) { ch.Transponder = t; ch.FreqInMhz = t.FrequencyInMhz; ch.SymbolRate = t.SymbolRate; ch.SatPosition = t.Satellite?.OrbitalPosition; ch.Satellite = t.Satellite?.Name; if (t.OriginalNetworkId != 0) { ch.OriginalNetworkId = t.OriginalNetworkId; } if (t.TransportStreamId != 0) { ch.TransportStreamId = t.TransportStreamId; } } return(ch); }