mirror of
https://github.com/PredatH0r/ChanSort.git
synced 2026-01-15 03:42:04 +01:00
added support for 3 different .DBM DVB-S sat receiver configurations
This commit is contained in:
@@ -19,7 +19,7 @@
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="ChanSort.Loader.DBM.ini">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)];
|
||||
|
||||
@@ -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[*];
|
||||
};
|
||||
|
||||
@@ -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[*];
|
||||
};
|
||||
|
||||
@@ -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[*];
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user