Re-implemented handling of DVB-S2

This commit is contained in:
Klaus Schmidinger
2008-04-12 13:39:12 +02:00
parent 0b82b38533
commit e59c6ac433
38 changed files with 1224 additions and 599 deletions

View File

@@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and
* how to reach the author.
*
* $Id: channels.c 1.60 2008/03/05 16:42:50 kls Exp $
* $Id: channels.c 2.1 2008/04/12 11:02:40 kls Exp $
*/
#include "channels.h"
@@ -21,67 +21,114 @@
// --- Channel Parameter Maps ------------------------------------------------
const tChannelParameterMap InversionValues[] = {
{ 0, INVERSION_OFF },
{ 1, INVERSION_ON },
{ 999, INVERSION_AUTO },
{ 0, DVBFE_INVERSION_OFF, trNOOP("off") },
{ 1, DVBFE_INVERSION_ON, trNOOP("on") },
{ 999, DVBFE_INVERSION_AUTO },
{ -1 }
};
const tChannelParameterMap BandwidthValues[] = {
{ 6, BANDWIDTH_6_MHZ },
{ 7, BANDWIDTH_7_MHZ },
{ 8, BANDWIDTH_8_MHZ },
{ 999, BANDWIDTH_AUTO },
{ 5, DVBFE_BANDWIDTH_5_MHZ, "5 MHz" },
{ 6, DVBFE_BANDWIDTH_6_MHZ, "6 MHz" },
{ 7, DVBFE_BANDWIDTH_7_MHZ, "7 MHz" },
{ 8, DVBFE_BANDWIDTH_8_MHZ, "8 MHz" },
{ 999, DVBFE_BANDWIDTH_AUTO },
{ -1 }
};
const tChannelParameterMap CoderateValues[] = {
{ 0, FEC_NONE },
{ 12, FEC_1_2 },
{ 23, FEC_2_3 },
{ 34, FEC_3_4 },
{ 45, FEC_4_5 },
{ 56, FEC_5_6 },
{ 67, FEC_6_7 },
{ 78, FEC_7_8 },
{ 89, FEC_8_9 },
{ 999, FEC_AUTO },
{ 0, DVBFE_FEC_NONE, trNOOP("none") },
{ 12, DVBFE_FEC_1_2, "1/2" },
{ 13, DVBFE_FEC_1_3, "1/3" },
{ 14, DVBFE_FEC_1_4, "1/4" },
{ 23, DVBFE_FEC_2_3, "2/3" },
{ 25, DVBFE_FEC_2_5, "2/5" },
{ 34, DVBFE_FEC_3_4, "3/4" },
{ 35, DVBFE_FEC_3_5, "3/5" },
{ 45, DVBFE_FEC_4_5, "4/5" },
{ 56, DVBFE_FEC_5_6, "5/6" },
{ 67, DVBFE_FEC_6_7, "6/7" },
{ 78, DVBFE_FEC_7_8, "7/8" },
{ 89, DVBFE_FEC_8_9, "8/9" },
{ 910, DVBFE_FEC_9_10, "9/10" },
{ 999, DVBFE_FEC_AUTO },
{ -1 }
};
const tChannelParameterMap ModulationValues[] = {
{ 0, QPSK },
{ 16, QAM_16 },
{ 32, QAM_32 },
{ 64, QAM_64 },
{ 128, QAM_128 },
{ 256, QAM_256 },
{ 999, QAM_AUTO },
{ 0, DVBFE_MOD_NONE, trNOOP("none") },
{ 4, DVBFE_MOD_QAM4, "QAM4" },
{ 16, DVBFE_MOD_QAM16, "QAM16" },
{ 32, DVBFE_MOD_QAM32, "QAM32" },
{ 64, DVBFE_MOD_QAM64, "QAM64" },
{ 128, DVBFE_MOD_QAM128, "QAM128" },
{ 256, DVBFE_MOD_QAM256, "QAM256" },
{ 512, DVBFE_MOD_QAM512, "QAM512" },
{1024, DVBFE_MOD_QAM1024, "QAM1024" },
{ 1, DVBFE_MOD_BPSK, "BPSK" },
{ 2, DVBFE_MOD_QPSK, "QPSK" },
{ 3, DVBFE_MOD_OQPSK, "OQPSK" },
{ 5, DVBFE_MOD_8PSK, "8PSK" },
{ 6, DVBFE_MOD_16APSK, "16APSK" },
{ 7, DVBFE_MOD_32APSK, "32APSK" },
{ 8, DVBFE_MOD_OFDM, "OFDM" },
{ 9, DVBFE_MOD_COFDM, "COFDM" },
{ 10, DVBFE_MOD_VSB8, "VSB8" },
{ 11, DVBFE_MOD_VSB16, "VSB16" },
{ 998, DVBFE_MOD_QAMAUTO, "QAMAUTO" },
{ 999, DVBFE_MOD_AUTO },
{ -1 }
};
const tChannelParameterMap SystemValues[] = {
{ 0, DVBFE_DELSYS_DVBS, "DVB-S" },
{ 1, DVBFE_DELSYS_DVBS2, "DVB-S2" },
{ -1 }
};
const tChannelParameterMap TransmissionValues[] = {
{ 2, TRANSMISSION_MODE_2K },
{ 8, TRANSMISSION_MODE_8K },
{ 999, TRANSMISSION_MODE_AUTO },
{ 2, DVBFE_TRANSMISSION_MODE_2K, "2K" },
{ 4, DVBFE_TRANSMISSION_MODE_4K, "4K" },
{ 8, DVBFE_TRANSMISSION_MODE_8K, "8K" },
{ 999, DVBFE_TRANSMISSION_MODE_AUTO },
{ -1 }
};
const tChannelParameterMap GuardValues[] = {
{ 4, GUARD_INTERVAL_1_4 },
{ 8, GUARD_INTERVAL_1_8 },
{ 16, GUARD_INTERVAL_1_16 },
{ 32, GUARD_INTERVAL_1_32 },
{ 999, GUARD_INTERVAL_AUTO },
{ 4, DVBFE_GUARD_INTERVAL_1_4, "1/4" },
{ 8, DVBFE_GUARD_INTERVAL_1_8, "1/8" },
{ 16, DVBFE_GUARD_INTERVAL_1_16, "1/16" },
{ 32, DVBFE_GUARD_INTERVAL_1_32, "1/32" },
{ 999, DVBFE_GUARD_INTERVAL_AUTO },
{ -1 }
};
const tChannelParameterMap HierarchyValues[] = {
{ 0, HIERARCHY_NONE },
{ 1, HIERARCHY_1 },
{ 2, HIERARCHY_2 },
{ 4, HIERARCHY_4 },
{ 999, HIERARCHY_AUTO },
{ 0, DVBFE_HIERARCHY_OFF, trNOOP("off") },
{ 1, DVBFE_HIERARCHY_ON, trNOOP("on") },
{ 999, DVBFE_HIERARCHY_AUTO },
{ -1 }
};
const tChannelParameterMap AlphaValues[] = {
{ 0, 0 },
{ 1, DVBFE_ALPHA_1 },
{ 2, DVBFE_ALPHA_2 },
{ 4, DVBFE_ALPHA_4 },
{ -1 }
};
const tChannelParameterMap PriorityValues[] = {
{ 0, DVBFE_STREAM_PRIORITY_HP, trNOOP("high") },
{ 1, DVBFE_STREAM_PRIORITY_LP, trNOOP("low") },
{ -1 }
};
const tChannelParameterMap RollOffValues[] = {
{ 0, DVBFE_ROLLOFF_UNKNOWN },
{ 20, DVBFE_ROLLOFF_20, "0.20" },
{ 25, DVBFE_ROLLOFF_25, "0.25" },
{ 35, DVBFE_ROLLOFF_35, "0.35" },
{ -1 }
};
@@ -107,11 +154,14 @@ int DriverIndex(int Value, const tChannelParameterMap *Map)
return -1;
}
int MapToUser(int Value, const tChannelParameterMap *Map)
int MapToUser(int Value, const tChannelParameterMap *Map, const char **String)
{
int n = DriverIndex(Value, Map);
if (n >= 0)
if (n >= 0) {
if (String)
*String = tr(Map[n].userString);
return Map[n].userValue;
}
return -1;
}
@@ -167,14 +217,18 @@ cChannel::cChannel(void)
provider = strdup("");
portalName = strdup("");
memset(&__BeginData__, 0, (char *)&__EndData__ - (char *)&__BeginData__);
inversion = INVERSION_AUTO;
bandwidth = BANDWIDTH_AUTO;
coderateH = FEC_AUTO;
coderateL = FEC_AUTO;
modulation = QAM_AUTO;
transmission = TRANSMISSION_MODE_AUTO;
guard = GUARD_INTERVAL_AUTO;
hierarchy = HIERARCHY_AUTO;
inversion = DVBFE_INVERSION_AUTO;
bandwidth = DVBFE_BANDWIDTH_AUTO;
coderateH = DVBFE_FEC_AUTO;
coderateL = DVBFE_FEC_AUTO;
modulation = DVBFE_MOD_AUTO;
system = DVBFE_DELSYS_DVBS;
transmission = DVBFE_TRANSMISSION_MODE_AUTO;
guard = DVBFE_GUARD_INTERVAL_AUTO;
hierarchy = DVBFE_HIERARCHY_AUTO;
alpha = 0;
priority = DVBFE_STREAM_PRIORITY_HP;
rollOff = DVBFE_ROLLOFF_UNKNOWN;
modification = CHANNELMOD_NONE;
schedule = NULL;
linkChannels = NULL;
@@ -277,13 +331,17 @@ void cChannel::CopyTransponderData(const cChannel *Channel)
coderateH = Channel->coderateH;
coderateL = Channel->coderateL;
modulation = Channel->modulation;
system = Channel->system;
transmission = Channel->transmission;
guard = Channel->guard;
hierarchy = Channel->hierarchy;
alpha = Channel->alpha;
priority = Channel->priority;
rollOff = Channel->rollOff;
}
}
bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH)
bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarization, int Srate, int CoderateH, int Modulation, int System, int RollOff)
{
// Workarounds for broadcaster stupidity:
// Some providers broadcast the transponder frequency of their channels with two different
@@ -297,19 +355,22 @@ bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarizatio
if (abs(srate - Srate) <= 1)
Srate = srate;
if (source != Source || frequency != Frequency || polarization != Polarization || srate != Srate || coderateH != CoderateH) {
if (Number()) {
dsyslog("changing transponder data of channel %d from %s:%d:%c:%d:%d to %s:%d:%c:%d:%d", Number(), *cSource::ToString(source), frequency, polarization, srate, coderateH, *cSource::ToString(Source), Frequency, Polarization, Srate, CoderateH);
modification |= CHANNELMOD_TRANSP;
Channels.SetModified();
}
if (source != Source || frequency != Frequency || polarization != Polarization || srate != Srate || coderateH != CoderateH || modulation != Modulation || system != System || rollOff != RollOff) {
cString OldParameters = ParametersToString();
source = Source;
frequency = Frequency;
polarization = Polarization;
srate = Srate;
coderateH = CoderateH;
modulation = QPSK;
modulation = Modulation;
system = System;
rollOff = RollOff;
schedule = NULL;
if (Number()) {
dsyslog("changing transponder data of channel %d from %d:%s:%s:%d to %d:%s:%s:%d", Number(), frequency, *OldParameters, *cSource::ToString(source), srate, Frequency, *ParametersToString(), *cSource::ToString(Source), Srate);
modification |= CHANNELMOD_TRANSP;
Channels.SetModified();
}
}
return true;
}
@@ -317,29 +378,26 @@ bool cChannel::SetSatTransponderData(int Source, int Frequency, char Polarizatio
bool cChannel::SetCableTransponderData(int Source, int Frequency, int Modulation, int Srate, int CoderateH)
{
if (source != Source || frequency != Frequency || modulation != Modulation || srate != Srate || coderateH != CoderateH) {
if (Number()) {
dsyslog("changing transponder data of channel %d from %s:%d:%d:%d:%d to %s:%d:%d:%d:%d", Number(), *cSource::ToString(source), frequency, modulation, srate, coderateH, *cSource::ToString(Source), Frequency, Modulation, Srate, CoderateH);
modification |= CHANNELMOD_TRANSP;
Channels.SetModified();
}
cString OldParameters = ParametersToString();
source = Source;
frequency = Frequency;
modulation = Modulation;
srate = Srate;
coderateH = CoderateH;
schedule = NULL;
if (Number()) {
dsyslog("changing transponder data of channel %d from %d:%s:%s:%d to %d:%s:%s:%d", Number(), frequency, *OldParameters, *cSource::ToString(source), srate, Frequency, *ParametersToString(), *cSource::ToString(Source), Srate);
modification |= CHANNELMOD_TRANSP;
Channels.SetModified();
}
}
return true;
}
bool cChannel::SetTerrTransponderData(int Source, int Frequency, int Bandwidth, int Modulation, int Hierarchy, int CoderateH, int CoderateL, int Guard, int Transmission)
bool cChannel::SetTerrTransponderData(int Source, int Frequency, int Bandwidth, int Modulation, int Hierarchy, int CoderateH, int CoderateL, int Guard, int Transmission, int Alpha, int Priority)
{
if (source != Source || frequency != Frequency || bandwidth != Bandwidth || modulation != Modulation || hierarchy != Hierarchy || coderateH != CoderateH || coderateL != CoderateL || guard != Guard || transmission != Transmission) {
if (Number()) {
dsyslog("changing transponder data of channel %d from %s:%d:%d:%d:%d:%d:%d:%d:%d to %s:%d:%d:%d:%d:%d:%d:%d:%d", Number(), *cSource::ToString(source), frequency, bandwidth, modulation, hierarchy, coderateH, coderateL, guard, transmission, *cSource::ToString(Source), Frequency, Bandwidth, Modulation, Hierarchy, CoderateH, CoderateL, Guard, Transmission);
modification |= CHANNELMOD_TRANSP;
Channels.SetModified();
}
if (source != Source || frequency != Frequency || bandwidth != Bandwidth || modulation != Modulation || hierarchy != Hierarchy || coderateH != CoderateH || coderateL != CoderateL || guard != Guard || transmission != Transmission || alpha != Alpha || priority != Priority) {
cString OldParameters = ParametersToString();
source = Source;
frequency = Frequency;
bandwidth = Bandwidth;
@@ -349,7 +407,14 @@ bool cChannel::SetTerrTransponderData(int Source, int Frequency, int Bandwidth,
coderateL = CoderateL;
guard = Guard;
transmission = Transmission;
alpha = Alpha;
priority = Priority;
schedule = NULL;
if (Number()) {
dsyslog("changing transponder data of channel %d from %d:%s:%s to %d:%s:%s", Number(), frequency, *OldParameters, *cSource::ToString(source), Frequency, *ParametersToString(), *cSource::ToString(Source));
modification |= CHANNELMOD_TRANSP;
Channels.SetModified();
}
}
return true;
}
@@ -597,13 +662,17 @@ cString cChannel::ParametersToString(void) const
char *q = buffer;
*q = 0;
ST(" S ") q += sprintf(q, "%c", polarization);
ST("CST") q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues));
ST(" T") q += PrintParameter(q, 'A', MapToUser(alpha, AlphaValues));
ST(" T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues));
ST("CST") q += PrintParameter(q, 'C', MapToUser(coderateH, CoderateValues));
ST(" T") q += PrintParameter(q, 'D', MapToUser(coderateL, CoderateValues));
ST("C T") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues));
ST(" T") q += PrintParameter(q, 'B', MapToUser(bandwidth, BandwidthValues));
ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues));
ST(" T") q += PrintParameter(q, 'G', MapToUser(guard, GuardValues));
ST("CST") q += PrintParameter(q, 'I', MapToUser(inversion, InversionValues));
ST("CST") q += PrintParameter(q, 'M', MapToUser(modulation, ModulationValues));
ST(" S ") q += PrintParameter(q, 'O', MapToUser(rollOff, RollOffValues));
ST(" T") q += PrintParameter(q, 'P', MapToUser(priority, PriorityValues));
ST(" S ") q += PrintParameter(q, 'S', MapToUser(system, SystemValues));
ST(" T") q += PrintParameter(q, 'T', MapToUser(transmission, TransmissionValues));
ST(" T") q += PrintParameter(q, 'Y', MapToUser(hierarchy, HierarchyValues));
return buffer;
}
@@ -628,6 +697,7 @@ bool cChannel::StringToParameters(const char *s)
{
while (s && *s) {
switch (toupper(*s)) {
case 'A': s = ParseParameter(s, alpha, AlphaValues); break;
case 'B': s = ParseParameter(s, bandwidth, BandwidthValues); break;
case 'C': s = ParseParameter(s, coderateH, CoderateValues); break;
case 'D': s = ParseParameter(s, coderateL, CoderateValues); break;
@@ -636,7 +706,11 @@ bool cChannel::StringToParameters(const char *s)
case 'I': s = ParseParameter(s, inversion, InversionValues); break;
case 'L': polarization = *s++; break;
case 'M': s = ParseParameter(s, modulation, ModulationValues); break;
case 'Z':// for compatibility with the original DVB-S2 patch - may be removed in future versions
case 'O': s = ParseParameter(s, rollOff, RollOffValues); break;
case 'P': s = ParseParameter(s, priority, PriorityValues); break;
case 'R': polarization = *s++; break;
case 'S': s = ParseParameter(s, system, SystemValues); break;
case 'T': s = ParseParameter(s, transmission, TransmissionValues); break;
case 'V': polarization = *s++; break;
case 'Y': s = ParseParameter(s, hierarchy, HierarchyValues); break;