Exemple #1
0
        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);
            }
        }
Exemple #2
0
        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);
        }