From cff07dbab2a8956edf16ca4b155c2db31b8c019c Mon Sep 17 00:00:00 2001 From: Horst Beham Date: Thu, 5 Jan 2023 19:18:43 +0100 Subject: [PATCH] added support for 3 different .DBM DVB-S sat receiver configurations --- .../ChanSort.Loader.DBM.csproj | 2 +- .../ChanSort.Loader.DBM.ini | 159 +++++++++++++++++- source/ChanSort.Loader.DBM/DbmSerializer.cs | 119 ++++++++----- .../dbm-163772-dvbc.h | 2 +- .../dbm-781736-dvbs.h | 70 ++++++++ .../dbm-793736-dvbs.h | 70 ++++++++ .../dbm-948368-dvbs.h | 70 ++++++++ 7 files changed, 444 insertions(+), 48 deletions(-) create mode 100644 source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-781736-dvbs.h create mode 100644 source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-793736-dvbs.h create mode 100644 source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-948368-dvbs.h diff --git a/source/ChanSort.Loader.DBM/ChanSort.Loader.DBM.csproj b/source/ChanSort.Loader.DBM/ChanSort.Loader.DBM.csproj index 0fb28d5..5bdfa6d 100644 --- a/source/ChanSort.Loader.DBM/ChanSort.Loader.DBM.csproj +++ b/source/ChanSort.Loader.DBM/ChanSort.Loader.DBM.csproj @@ -19,7 +19,7 @@ - PreserveNewest + Always diff --git a/source/ChanSort.Loader.DBM/ChanSort.Loader.DBM.ini b/source/ChanSort.Loader.DBM/ChanSort.Loader.DBM.ini index 1095e1d..31f0d32 100644 --- a/source/ChanSort.Loader.DBM/ChanSort.Loader.DBM.ini +++ b/source/ChanSort.Loader.DBM/ChanSort.Loader.DBM.ini @@ -1,4 +1,5 @@ [dbm:163772] +; overall file layout isDvbS=false offChecksum=0x0000 offDataLength=0x0002 @@ -16,11 +17,11 @@ offChannelData=0x0EBA numChannel=1000 lenChannelData=160 -[transponder:163772] +;transponder record offFreq=0 offSymRate=8 -[channel:163772] +;channel record offName=0 lenName=64 offProgNr=64 @@ -31,3 +32,157 @@ offOnid=98 offSid=100 offPcrPid=104 offVideoPid=106 + +;--------------------------------------- + +[dbm:781736] +; overall file layout +isDvbS=true +offChecksum=0x0000 +offDataLength=0x0002 +offData=0x0006 + +offSatelliteBitmap=0x0006 +lenSatelliteBitmap=28 +offSatelliteData=0x0022 +numSatellite=200 +lenSatelliteData=84 + +offTransponderBitmap=0x41C2 +lenTransponderBitmap=376 +offTransponderData=0x433A +numTransponder=3000 +lenTransponderData=36 + +offChannelBitmap=0x1E930 +lenChannelBitmap=502 +offChannelData=0x1EB26 +numChannel=4000 +lenChannelData=164 + +;satellite record +offSatName=0 +lenSatName=34 +offLowFreq=34 +offHighFreq=36 +offOribalPos=74 + +;transponder record +offFreq=0 +offSymRate=20 + +;channel record +offName=0 +lenName=64 +offProgNr=64 +offLcn=66 +offSatelliteIndex=70 +offTransponderIndex=72 +offTsid=100 +offOnid=102 +offSid=104 +offPcrPid=108 +offVideoPid=110 + + +;--------------------------------------- + +[dbm:793736] +; overall file layout +isDvbS=true +offChecksum=0x0000 +offDataLength=0x0002 +offData=0x0006 + +offSatelliteBitmap=0x0006 +lenSatelliteBitmap=28 +offSatelliteData=0x0022 +numSatellite=200 +lenSatelliteData=84 + +offTransponderBitmap=0x41C2 +lenTransponderBitmap=376 +offTransponderData=0x433A +numTransponder=3000 +lenTransponderData=40 + +offChannelBitmap=0x21810 +lenChannelBitmap=502 +offChannelData=0x21A06 +numChannel=4000 +lenChannelData=164 + +;satellite record +offSatName=0 +lenSatName=34 +offLowFreq=34 +offHighFreq=36 +offOribalPos=74 + +;transponder record +offFreq=0 +offSymRate=20 + +;channel record +offName=0 +lenName=64 +offProgNr=64 +offLcn=66 +offSatelliteIndex=70 +offTransponderIndex=72 +offTsid=100 +offOnid=102 +offSid=104 +offPcrPid=108 +offVideoPid=110 + +;--------------------------------------- + +[dbm:948368] +; overall file layout +isDvbS=true +offChecksum=0x0000 +offDataLength=0x0002 +offData=0x0006 + +offSatelliteBitmap=0x0006 +lenSatelliteBitmap=32 +offSatelliteData=0x0026 +numSatellite=254 +lenSatelliteData=76 + +offTransponderBitmap=0x4b8e +lenTransponderBitmap=376 +offTransponderData=0x4d06 +numTransponder=3000 +lenTransponderData=36 + +offChannelBitmap=0x1f2fc +lenChannelBitmap=626 +offChannelData=0x1f56e +numChannel=5000 +lenChannelData=164 + +;satellite record +offSatName=0 +lenSatName=34 +offLowFreq=34 +offHighFreq=36 +offOribalPos=74 + +;transponder record +offFreq=0 +offSymRate=20 + +;channel record +offName=0 +lenName=64 +offProgNr=64 +offLcn=66 +offSatelliteIndex=70 +offTransponderIndex=72 +offTsid=100 +offOnid=102 +offSid=104 +offPcrPid=108 +offVideoPid=110 diff --git a/source/ChanSort.Loader.DBM/DbmSerializer.cs b/source/ChanSort.Loader.DBM/DbmSerializer.cs index bf0744f..2c2cc81 100644 --- a/source/ChanSort.Loader.DBM/DbmSerializer.cs +++ b/source/ChanSort.Loader.DBM/DbmSerializer.cs @@ -7,21 +7,20 @@ using ChanSort.Api; namespace ChanSort.Loader.DBM { /* - - + Loads .DBM binary channel lists from Xoro, TechniSat, ... + There are different variants for DVB-S, DVB-C, ... which require specific configuration entries in ChanSort.Loader.DBM.ini */ public class DbmSerializer : SerializerBase { + private byte[] data; + private readonly IniFile ini; private IniFile.Section sec; private DataMapping mapping; - private readonly ChannelList allChannels = new ChannelList(SignalSource.All, "All"); - - private byte[] data; - private int fileSize; - - private readonly StringBuilder logMessages = new StringBuilder(); - + private bool isDvbS; + + private readonly ChannelList allChannels = new(SignalSource.All, "All"); + private readonly StringBuilder logMessages = new(); #region ctor() public DbmSerializer(string inputFile) : base(inputFile) @@ -60,28 +59,27 @@ namespace ChanSort.Loader.DBM public override void Load() { var info = new FileInfo(this.FileName); - this.fileSize = (int)info.Length; - - this.sec = ini.GetSection("dbm:" + this.fileSize); + this.sec = ini.GetSection("dbm:" + info.Length); if (sec == null) throw LoaderException.Fail($"No configuration for .DBM files with size {info.Length} in .ini file"); - if (!sec.GetBool("isDvbS")) + this.isDvbS = sec.GetBool("isDvbS"); + if (!isDvbS) allChannels.VisibleColumnFieldNames.Remove(nameof(ChannelInfo.Satellite)); this.data = File.ReadAllBytes(this.FileName); this.mapping = new DataMapping(sec); this.mapping.SetDataPtr(data, 0); - ValidateChecksum(data, sec); - - LoadTransponder(sec, data); - LoadChannels(sec, data); + ValidateChecksum(); + LoadSatellites(); + LoadTransponder(); + LoadChannels(); } #endregion #region ValidateChecksum() - private void ValidateChecksum(byte[] data, IniFile.Section sec) + private void ValidateChecksum() { var expectedChecksum = BitConverter.ToUInt16(data, 0); var calculatedChecksum = CalcChecksum(data, sec.GetInt("offData"), (int)mapping.GetDword("offDataLength")); @@ -91,18 +89,47 @@ namespace ChanSort.Loader.DBM throw LoaderException.Fail(msg); } } + #endregion + #region LoadSatellites() + private void LoadSatellites() + { + if (!this.isDvbS) + return; + + var num = sec.GetInt("numSatellite"); + var offBitmap = sec.GetInt("offSatelliteBitmap"); + + mapping.SetDataPtr(data, sec.GetInt("offSatelliteData")); + var recordSize = sec.GetInt("lenSatelliteData"); + + for (int i = 0; i < num; i++) + { + if ((data[offBitmap + i / 8] & (1 << (i & 0x07))) != 0) + { + var s = new Satellite(i); + s.Name = mapping.GetString("offSatName", sec.GetInt("lenSatName")); + var pos = mapping.GetWord("offOrbitalPos"); + var suffix = pos <= 180 ? "E" : "W"; + if (pos >= 180 && pos <= 360) + pos = (ushort)(360 - pos); + s.OrbitalPosition = $"{pos / 10}.{pos % 10}{suffix}"; + this.DataRoot.AddSatellite(s); + } + + mapping.BaseOffset += recordSize; + } + } #endregion #region LoadTransponder() - private void LoadTransponder(IniFile.Section sec, byte[] data) + private void LoadTransponder() { var num = sec.GetInt("numTransponder"); var offBitmap = sec.GetInt("offTransponderBitmap"); - var map = new DataMapping(ini.GetSection("transponder:" + this.fileSize)); - map.SetDataPtr(data, sec.GetInt("offTransponderData")); + mapping.SetDataPtr(data, sec.GetInt("offTransponderData")); var recordSize = sec.GetInt("lenTransponderData"); for (int i = 0; i < num; i++) @@ -110,26 +137,26 @@ namespace ChanSort.Loader.DBM if ((data[offBitmap + i / 8] & (1 << (i & 0x07))) != 0) { var t = new Transponder(i); - t.FrequencyInMhz = (decimal)map.GetDword("offFreq") / 1000; - t.SymbolRate = (int)map.GetDword("offSymRate"); + t.FrequencyInMhz = (decimal)mapping.GetDword("offFreq"); + if (!isDvbS) + t.FrequencyInMhz /= 1000; + t.SymbolRate = (int)mapping.GetWord("offSymRate"); this.DataRoot.AddTransponder(null, t); } - map.BaseOffset += recordSize; + mapping.BaseOffset += recordSize; } } #endregion #region LoadChannels() - private void LoadChannels(IniFile.Section sec, byte[] data) + private void LoadChannels() { var num = sec.GetInt("numChannel"); var offBitmap = sec.GetInt("offChannelBitmap"); - var sec2 = ini.GetSection("channel:" + this.fileSize); - var map = new DataMapping(sec2); - map.SetDataPtr(data, sec.GetInt("offChannelData")); + mapping.SetDataPtr(data, sec.GetInt("offChannelData")); var recordSize = sec.GetInt("lenChannelData"); var dec = new DvbStringDecoder(this.DefaultEncoding); @@ -139,17 +166,17 @@ namespace ChanSort.Loader.DBM if ((data[offBitmap + i / 8] & (1 << (i & 0x07))) != 0) { var c = new ChannelInfo(SignalSource.Any, i, -1, null); - dec.GetChannelNames(data, map.BaseOffset + sec2.GetInt("offName"), sec2.GetInt("lenName"), out var longName, out var shortName); + dec.GetChannelNames(data, mapping.BaseOffset + sec.GetInt("offName"), sec.GetInt("lenName"), out var longName, out var shortName); c.Name = longName; c.ShortName = shortName; - c.OldProgramNr = map.GetWord("offProgNr") + 1; - c.OriginalNetworkId = map.GetWord("offOnid"); - c.TransportStreamId = map.GetWord("offTsid"); - c.ServiceId = map.GetWord("offSid"); - c.PcrPid = map.GetWord("offPcrPid"); - c.VideoPid = map.GetWord("offVideoPid"); + c.OldProgramNr = mapping.GetWord("offProgNr") + 1; + c.OriginalNetworkId = mapping.GetWord("offOnid"); + c.TransportStreamId = mapping.GetWord("offTsid"); + c.ServiceId = mapping.GetWord("offSid"); + c.PcrPid = mapping.GetWord("offPcrPid"); + c.VideoPid = mapping.GetWord("offVideoPid"); - var transpIdx = map.GetByte("offTransponderIndex"); + var transpIdx = isDvbS ? mapping.GetWord("offTransponderIndex") : mapping.GetByte("offTransponderIndex"); var tp = this.DataRoot.Transponder.TryGet(transpIdx); if (tp != null) { @@ -157,10 +184,16 @@ namespace ChanSort.Loader.DBM c.SymbolRate = tp.SymbolRate; } + if (isDvbS && this.DataRoot.Satellites.TryGetValue(mapping.GetWord("offSatelliteIndex"), out var sat)) + { + c.Satellite = sat.Name; + c.SatPosition = sat.OrbitalPosition; + } + this.DataRoot.AddChannel(this.allChannels, c); } - map.BaseOffset += recordSize; + mapping.BaseOffset += recordSize; } } #endregion @@ -170,19 +203,18 @@ namespace ChanSort.Loader.DBM #region Save() public override void Save() { - var sec2 = ini.GetSection("channel:" + this.fileSize); - var map = new DataMapping(sec2); var baseOffset = sec.GetInt("offChannelData"); - map.SetDataPtr(data, baseOffset); var recordSize = sec.GetInt("lenChannelData"); foreach (var chan in this.allChannels.Channels) { - if (chan.IsProxy) continue; - map.BaseOffset = baseOffset + (int)chan.RecordIndex * recordSize; - map.SetWord("offProgNr", chan.NewProgramNr - 1); + if (chan.IsProxy) + continue; + mapping.BaseOffset = baseOffset + (int)chan.RecordIndex * recordSize; + mapping.SetWord("offProgNr", chan.NewProgramNr - 1); } + mapping.BaseOffset = 0; var calculatedChecksum = CalcChecksum(data, sec.GetInt("offData"), (int)mapping.GetDword("offDataLength")); mapping.SetWord("offChecksum", calculatedChecksum); File.WriteAllBytes(this.FileName, this.data); @@ -204,7 +236,6 @@ namespace ChanSort.Loader.DBM } #endregion - // framework support methods #region GetFileInformation diff --git a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-163772-dvbc.h b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-163772-dvbc.h index 5d62919..22a5c10 100644 --- a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-163772-dvbc.h +++ b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-163772-dvbc.h @@ -5,7 +5,7 @@ struct s_Transponder var off0 = current_offset; dword Freq; byte unk1[4]; - dword SymRate; + word SymRate; var off1 = current_offset; byte unk[36 - (off1 - off0)]; diff --git a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-781736-dvbs.h b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-781736-dvbs.h new file mode 100644 index 0000000..4424442 --- /dev/null +++ b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-781736-dvbs.h @@ -0,0 +1,70 @@ +#include "chansort.h" + +struct s_Satellite +{ + var off0 = current_offset; + byte Name[34]; + word LowFreq; + word HighFreq; + var off1 = current_offset; + byte u1[74 - (off1 - off0)]; + word OrbitalPos; + + var off1 = current_offset; + byte unk[84 - (off1 - off0)]; +}; + +struct s_Transponder +{ + var off0 = current_offset; + dword Freq; + byte unk1[16]; + word SymRate; + var off1 = current_offset; + + byte unk[36 - (off1 - off0)]; +}; + +struct s_Channel +{ + var off0 = current_offset; + byte Name[64]; + word progNrMinus1; + word lcn; + byte u3[2]; + word satelliteIndex; + word transponderIndex; + byte u4[26]; + word tsid; + word onid; + word sid; + + byte u5[2]; + word pcrPidMaybe; + word vpidMaybe; + + var off1 = current_offset; + byte unk[164 - (off1-off0)]; +}; + + +public struct DBM_781736_DvbS +{ + word BytesumPlus0x55; + dword DataLengthForBytesum; + + byte SatelliteBitmap[28]; + s_Satellite SatelliteData[200]; + + byte TransponderBitmap[376]; + s_Transponder TransponderData[3000]; + + var off0 = current_offset; + byte unk1[0x1E930 - off0]; + + byte ChannelBitmap[502]; + s_Channel ChannelData[4000]; + + byte Extra[*]; +}; + diff --git a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-793736-dvbs.h b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-793736-dvbs.h new file mode 100644 index 0000000..8420efa --- /dev/null +++ b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-793736-dvbs.h @@ -0,0 +1,70 @@ +#include "chansort.h" + +struct s_Satellite +{ + var off0 = current_offset; + byte Name[34]; + word LowFreq; + word HighFreq; + var off1 = current_offset; + byte u1[74 - (off1 - off0)]; + word OrbitalPos; + + var off1 = current_offset; + byte unk[84 - (off1 - off0)]; +}; + +struct s_Transponder +{ + var off0 = current_offset; + dword Freq; + byte unk1[16]; + word SymRate; + var off1 = current_offset; + + byte unk[40 - (off1 - off0)]; +}; + +struct s_Channel +{ + var off0 = current_offset; + byte Name[64]; + word progNrMinus1; + word lcn; + byte u3[2]; + word satelliteIndex; + word transponderIndex; + byte u4[26]; + word tsid; + word onid; + word sid; + + byte u5[2]; + word pcrPidMaybe; + word vpidMaybe; + + var off1 = current_offset; + byte unk[164 - (off1-off0)]; +}; + + +public struct DBM_793736_DvbS +{ + word BytesumPlus0x55; + dword DataLengthForBytesum; + + byte SatelliteBitmap[28]; + s_Satellite SatelliteData[200]; + + byte TransponderBitmap[376]; + s_Transponder TransponderData[3000]; + + var off0 = current_offset; + byte unk1[0x21810 - off0]; + + byte ChannelBitmap[502]; + s_Channel ChannelData[4000]; + + byte Extra[*]; +}; + diff --git a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-948368-dvbs.h b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-948368-dvbs.h new file mode 100644 index 0000000..94c462a --- /dev/null +++ b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-948368-dvbs.h @@ -0,0 +1,70 @@ +#include "chansort.h" + +struct s_Satellite +{ + var off0 = current_offset; + byte Name[34]; + word LowFreq; + word HighFreq; + var off1 = current_offset; + byte u1[74 - (off1 - off0)]; + word OrbitalPos; + + var off1 = current_offset; + byte unk[76 - (off1 - off0)]; +}; + +struct s_Transponder +{ + var off0 = current_offset; + dword Freq; + byte unk1[16]; + word SymRate; + var off1 = current_offset; + + byte unk[36 - (off1 - off0)]; +}; + +struct s_Channel +{ + var off0 = current_offset; + byte Name[64]; + word progNrMinus1; + word lcn; + byte u3[2]; + word satelliteIndex; + word transponderIndex; + byte u4[26]; + word tsid; + word onid; + word sid; + + byte u5[2]; + word pcrPidMaybe; + word vpidMaybe; + + var off1 = current_offset; + byte unk[164 - (off1-off0)]; +}; + + +public struct DBM_948368_DvbS +{ + word BytesumPlus0x55; + dword DataLengthForBytesum; + + byte SatelliteBitmap[32]; + s_Satellite SatelliteData[254]; + + byte TransponderBitmap[376]; + s_Transponder TransponderData[3000]; + + var off0 = current_offset; + byte unk1[0x1f2fc - off0]; + + byte ChannelBitmap[626]; + s_Channel ChannelData[5000]; + + byte Extra[*]; +}; +