From 45367366ca095ed743c12e09797c62edc896902b Mon Sep 17 00:00:00 2001 From: Horst Beham Date: Fri, 6 Jan 2023 14:00:08 +0100 Subject: [PATCH] - merged all Hex Editor Neo structure definitions for MStar *.dbm variants into a single file - added more DBM configurations --- .../ChanSort.Loader.Android/AndroidPlugin.cs | 3 + .../ChanSort.Loader.DBM.ini | 80 ++++++++ source/ChanSort.Loader.DBM/DbmSerializer.cs | 18 +- .../dbm-163772-dvbc.h | 52 ----- .../dbm-781736-dvbs.h | 70 ------- .../dbm-793736-dvbs.h | 70 ------- .../dbm-948368-dvbs.h | 70 ------- .../dbm.h | 186 ++++++++++++++++++ source/changelog.md | 5 + 9 files changed, 287 insertions(+), 267 deletions(-) delete mode 100644 source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-163772-dvbc.h delete mode 100644 source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-781736-dvbs.h delete mode 100644 source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-793736-dvbs.h delete mode 100644 source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-948368-dvbs.h create mode 100644 source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm.h diff --git a/source/ChanSort.Loader.Android/AndroidPlugin.cs b/source/ChanSort.Loader.Android/AndroidPlugin.cs index 5fc5c7b..01c81e9 100644 --- a/source/ChanSort.Loader.Android/AndroidPlugin.cs +++ b/source/ChanSort.Loader.Android/AndroidPlugin.cs @@ -17,6 +17,9 @@ namespace ChanSort.Loader.Android if (file.StartsWith("dvr_rtk_tv") && file.EndsWith(".db")) return new AldenSerializer(inputFile); + if (!file.EndsWith(".db")) + return null; + throw LoaderException.TryNext(SerializerBase.ERR_UnknownFormat); } } diff --git a/source/ChanSort.Loader.DBM/ChanSort.Loader.DBM.ini b/source/ChanSort.Loader.DBM/ChanSort.Loader.DBM.ini index 31f0d32..9911cdd 100644 --- a/source/ChanSort.Loader.DBM/ChanSort.Loader.DBM.ini +++ b/source/ChanSort.Loader.DBM/ChanSort.Loader.DBM.ini @@ -27,6 +27,12 @@ lenName=64 offProgNr=64 offLcn=66 offTransponderIndex=70 +offServiceType=76 +;offSkip=79 +;maskSkip=0x08 +;offLock=79 +;maskLock=0x10 +;offFavorites=81 offTsid=96 offOnid=98 offSid=100 @@ -78,12 +84,74 @@ offProgNr=64 offLcn=66 offSatelliteIndex=70 offTransponderIndex=72 +offServiceType=80 +offSkip=81 +maskSkip=0x08 +offLock=81 +maskLock=0x10 +offFavorites=83 offTsid=100 offOnid=102 offSid=104 offPcrPid=108 offVideoPid=110 +;--------------------------------------- + +[dbm:785256] +; overall file layout +isDvbS=true +offChecksum=0x0000 +offDataLength=0x0002 +offData=0x0006 + +offSatelliteBitmap=0x0006 +lenSatelliteBitmap=32 +offSatelliteData=0x0026 +numSatellite=254 +lenSatelliteData=80 + +offTransponderBitmap=0x4f86 +lenTransponderBitmap=376 +offTransponderData=0x50fe +numTransponder=3000 +lenTransponderData=36 + +offChannelBitmap=0x1f6f2 +lenChannelBitmap=500 +offChannelData=0x1f8e6 +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 +offServiceType=80 +offSkip=81 +maskSkip=0x08 +offLock=81 +maskLock=0x10 +offFavorites=83 +offTsid=100 +offOnid=102 +offSid=104 +offPcrPid=108 +offVideoPid=110 ;--------------------------------------- @@ -130,6 +198,12 @@ offProgNr=64 offLcn=66 offSatelliteIndex=70 offTransponderIndex=72 +offServiceType=80 +offSkip=81 +maskSkip=0x08 +offLock=81 +maskLock=0x10 +offFavorites=83 offTsid=100 offOnid=102 offSid=104 @@ -181,6 +255,12 @@ offProgNr=64 offLcn=66 offSatelliteIndex=70 offTransponderIndex=72 +offServiceType=80 +offSkip=81 +maskSkip=0x08 +offLock=81 +maskLock=0x10 +offFavorites=83 offTsid=100 offOnid=102 offSid=104 diff --git a/source/ChanSort.Loader.DBM/DbmSerializer.cs b/source/ChanSort.Loader.DBM/DbmSerializer.cs index 2c2cc81..bfddeea 100644 --- a/source/ChanSort.Loader.DBM/DbmSerializer.cs +++ b/source/ChanSort.Loader.DBM/DbmSerializer.cs @@ -26,13 +26,13 @@ namespace ChanSort.Loader.DBM public DbmSerializer(string inputFile) : base(inputFile) { this.Features.ChannelNameEdit = ChannelNameEditMode.None; - this.Features.CanSkipChannels = false; - this.Features.CanLockChannels = false; + this.Features.CanSkipChannels = true; + this.Features.CanLockChannels = true; this.Features.CanHideChannels = false; this.Features.DeleteMode = DeleteMode.NotSupported; this.Features.CanHaveGaps = false; - this.Features.FavoritesMode = FavoritesMode.None; - this.Features.MaxFavoriteLists = 0; + this.Features.FavoritesMode = FavoritesMode.Flags; + this.Features.MaxFavoriteLists = 4; this.Features.AllowGapsInFavNumbers = false; this.Features.CanEditFavListNames = false; @@ -45,7 +45,7 @@ namespace ChanSort.Loader.DBM list.VisibleColumnFieldNames.Remove(nameof(ChannelInfo.Provider)); list.VisibleColumnFieldNames.Remove(nameof(ChannelInfo.Encrypted)); list.VisibleColumnFieldNames.Remove(nameof(ChannelInfo.ServiceType)); - list.VisibleColumnFieldNames.Remove(nameof(ChannelInfo.ServiceTypeName)); + list.VisibleColumnFieldNames.Add(nameof(ChannelInfo.ServiceTypeName)); } string iniFile = Assembly.GetExecutingAssembly().Location.Replace(".dll", ".ini"); @@ -175,6 +175,14 @@ namespace ChanSort.Loader.DBM c.ServiceId = mapping.GetWord("offSid"); c.PcrPid = mapping.GetWord("offPcrPid"); c.VideoPid = mapping.GetWord("offVideoPid"); + c.Skip = mapping.GetFlag("Skip", false); + c.Lock = mapping.GetFlag("Lock", false); + var serviceType = mapping.GetByte("offServiceType"); + c.ServiceTypeName = serviceType == 1 ? "TV" : serviceType == 2 ? "Radio" : ""; + + var fav = mapping.GetByte("offFavorites"); + fav = (byte)(((fav >> 1) & 0x0E) | (fav & 0x01)); // A=1, B=4, C=8, D=16 + c.Favorites = (Favorites)fav; var transpIdx = isDvbS ? mapping.GetWord("offTransponderIndex") : mapping.GetByte("offTransponderIndex"); var tp = this.DataRoot.Transponder.TryGet(transpIdx); 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 deleted file mode 100644 index 22a5c10..0000000 --- a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-163772-dvbc.h +++ /dev/null @@ -1,52 +0,0 @@ -#include "chansort.h" - -struct s_Transponder -{ - var off0 = current_offset; - dword Freq; - byte unk1[4]; - 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]; - byte transponderIndex; - byte u4[25]; - word tsid; - word onid; - word sid; - - byte u5[2]; - word pcrPidMaybe; - word vpidMaybe; - - var off1 = current_offset; - byte unk[160 - (off1-off0)]; -}; - - -public struct DBM_163772_DvbC -{ - word BytesumPlus0x55; - dword DataLengthForBytesum; - - byte TransponderBitmap[16]; - s_Transponder TransponderData[100]; - - var off0 = current_offset; - byte unk1[0x0E3C - off0]; - - byte ChannelBitmap[126]; - s_Channel ChannelData[1000]; - - byte Extra[*]; -}; - 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 deleted file mode 100644 index 4424442..0000000 --- a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-781736-dvbs.h +++ /dev/null @@ -1,70 +0,0 @@ -#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 deleted file mode 100644 index 8420efa..0000000 --- a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-793736-dvbs.h +++ /dev/null @@ -1,70 +0,0 @@ -#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 deleted file mode 100644 index 94c462a..0000000 --- a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm-948368-dvbs.h +++ /dev/null @@ -1,70 +0,0 @@ -#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[*]; -}; - diff --git a/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm.h b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm.h new file mode 100644 index 0000000..fd13702 --- /dev/null +++ b/source/Information/FileStructures_for_HHD_Hex_Editor_Neo/dbm.h @@ -0,0 +1,186 @@ +#include "chansort.h" +#pragma script("get_doc_size.js") + +/* +structure definition for various variants of MStar (aka MorningStar) DVB-C and DVB-S receiver channel list formats. +Also used by various models from brands like AEG, Akiwa, Auvisio, Boca, Botech, Comag, Dyon, LogiSat, Kjaerulff, Micro, Megasat, Schwaiger, SeaSat, Strong, TechniSat, TeleSystem, Trekstor, Xoro, Zehnder, ... +Typical file names include: vodafone.DBM, HB_DATABASE_6_29.DBM, MAS_HRS8520_23_08_2011.DBM, ... +*/ + +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[satRecordLength - (off1 - off0)]; +}; + +struct s_Transponder +{ + var off0 = current_offset; + dword Freq; + byte unk1[16]; + word SymRate; + var off1 = current_offset; + + byte unk[transponderRecordLength - (off1 - off0)]; +}; + +enum e_Favorites : byte +{ + A=0x01, + B=0x04, + C=0x08, + D=0x10 +}; + +enum e_Flags : byte +{ + Skip=0x08, + Lock=0x10 +}; + +enum e_ServiceType : byte +{ + TV=1, + Radio=2 +}; + +struct s_Channel +{ + var off0 = current_offset; + byte Name[64]; + word progNrMinus1; + word lcn; + byte u3[2]; + word satelliteIndex; + word transponderIndex; + byte u4[bytesBetweenTransponderIndexAndServiceType]; + e_ServiceType serviceType; + e_Flags flags; + byte u5; + e_Favorites favorites; + byte u6[16]; + word tsid; + word onid; + word sid; + + byte u7[2]; + word pcrPidMaybe; + word vpidMaybe; + + var off1 = current_offset; + byte unk[channelRecordLength - (off1-off0)]; +}; + + +public struct DBM +{ + var satBitmapLength = 0; + var satRecordCount = 0; + var satRecordLength = 0; + var transponderBitmapLength = 0; + var transponderRecordCount = 0; + var transponderRecordLength = 0; + var unknownDataLength = 0; + var channelBitmapLength = 0; + var channelRecordCount = 0; + var channelRecordLength = 0; + var bytesBetweenTransponderIndexAndServiceType = 6; + + switch (GetDocumentSize()) + { + case 163772: + // TechniSat DVB-C vodafone.DBM + satBitmapLength = 0; + satRecordCount = 0; + satRecordLength = 84; + transponderBitmapLength = 16; + transponderRecordCount = 100; + transponderRecordLength = 36; + unknownDataLength = 22; + channelBitmapLength = 126; + channelRecordCount = 1000; + channelRecordLength = 160; + bytesBetweenTransponderIndexAndServiceType = 2; + break; + case 781736: + // Strong HB_DATABASE_1_18.DBM, Xoro HB_DATABASE_6_29.DBM + satBitmapLength = 28; + satRecordCount = 200; + satRecordLength = 84; + transponderBitmapLength = 376; + transponderRecordCount = 3000; + transponderRecordLength = 36; + unknownDataLength = 22; + channelBitmapLength = 502; + channelRecordCount = 4000; + channelRecordLength = 164; + break; + case 785256: + // Strong HB_DATABASE_5_4.DBM + satBitmapLength = 32; + satRecordCount = 254; + satRecordLength = 80; + transponderBitmapLength = 376; + transponderRecordCount = 3000; + transponderRecordLength = 36; + unknownDataLength = 20; + channelBitmapLength = 500; + channelRecordCount = 4000; + channelRecordLength = 164; + break; + case 793736: + // Xoro HB_DATABASE_8_19.DBM + satBitmapLength = 28; + satRecordCount = 200; + satRecordLength = 84; + transponderBitmapLength = 376; + transponderRecordCount = 3000; + transponderRecordLength = 40; + unknownDataLength = 22; + channelBitmapLength = 502; + channelRecordCount = 4000; + channelRecordLength = 164; + break; + case 948368: + // Comag SL40HD_V1_17_02, Xoro HRS 8520, ... + satBitmapLength = 32; + satRecordCount = 254; + satRecordLength = 76; + transponderBitmapLength = 376; + transponderRecordCount = 3000; + transponderRecordLength = 36; + unknownDataLength = 22; + channelBitmapLength = 626; + channelRecordCount = 5000; + channelRecordLength = 164; + break; + default: + $assert(false, "Structure for this file size is not supported"); + break; + } + + word BytesumPlus0x55; + dword DataLengthForBytesum; + + byte SatelliteBitmap[satBitmapLength]; + s_Satellite SatelliteData[satRecordCount]; + + byte TransponderBitmap[transponderBitmapLength]; + s_Transponder TransponderData[transponderRecordCount]; + + byte unknown[unknownDataLength]; + + byte ChannelBitmap[channelBitmapLength]; + s_Channel ChannelData[channelRecordCount]; + + byte Extra[*]; +}; + diff --git a/source/changelog.md b/source/changelog.md index 5230be6..31613f3 100644 --- a/source/changelog.md +++ b/source/changelog.md @@ -1,6 +1,11 @@ ChanSort Change Log =================== +2023-01-06 +- added support for numerous .DBM file formats used by DVB-C and DVB-S receivers based on + MStar chips. Known brands to use this format include Xoro, TechniSat, Strong, Comag and + many more. (If your file isn't recoginezed, please send it to me to add support for it) + 2023-01-04 - TCL/Thomson: improved file detection (.tar file or directory containing DtvData.db, satellite.db, cloneCRC.bin)