File indexing completed on 2024-05-12 04:52:21
0001 /* 0002 * dvbtransponder.h 0003 * 0004 * Copyright (C) 2007-2011 Christoph Pfister <christophpfister@gmail.com> 0005 * 0006 * This program is free software; you can redistribute it and/or modify 0007 * it under the terms of the GNU General Public License as published by 0008 * the Free Software Foundation; either version 2 of the License, or 0009 * (at your option) any later version. 0010 * 0011 * This program is distributed in the hope that it will be useful, 0012 * but WITHOUT ANY WARRANTY; without even the implied warranty of 0013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0014 * GNU General Public License for more details. 0015 * 0016 * You should have received a copy of the GNU General Public License along 0017 * with this program; if not, write to the Free Software Foundation, Inc., 0018 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 0019 */ 0020 0021 #ifndef DVBTRANSPONDER_H 0022 #define DVBTRANSPONDER_H 0023 0024 #include <string.h> 0025 0026 class QDataStream; 0027 class QString; 0028 class DvbTransponder; 0029 0030 class DvbTransponderBase 0031 { 0032 public: 0033 enum TransmissionType { 0034 Invalid = 7, 0035 DvbC = 0, 0036 DvbS = 1, 0037 DvbS2 = 4, 0038 DvbT = 2, 0039 DvbT2 = 6, 0040 Atsc = 3, 0041 IsdbT = 5, 0042 }; 0043 0044 enum FecRate { 0045 FecNone = 0, 0046 Fec1_2 = 1, 0047 Fec1_3 = 10, 0048 Fec1_4 = 11, 0049 Fec2_3 = 2, 0050 Fec2_5 = 12, 0051 Fec3_4 = 3, 0052 Fec3_5 = 13, 0053 Fec4_5 = 4, 0054 Fec5_6 = 5, 0055 Fec6_7 = 6, 0056 Fec7_8 = 7, 0057 Fec8_9 = 8, 0058 Fec9_10 = 14, 0059 FecAuto = 9 0060 }; 0061 0062 protected: 0063 TransmissionType transmissionType : 8; 0064 }; 0065 0066 class DvbCTransponder : public DvbTransponderBase 0067 { 0068 public: 0069 enum Modulation { 0070 Qam16 = 0, 0071 Qam32 = 1, 0072 Qam64 = 2, 0073 Qam128 = 3, 0074 Qam256 = 4, 0075 ModulationAuto = 5 0076 }; 0077 0078 void readTransponder(QDataStream &stream); 0079 bool fromString(const QString &string); 0080 QString toString() const; 0081 bool corresponds(const DvbTransponder &transponder) const; 0082 0083 Modulation modulation : 8; 0084 FecRate fecRate : 8; 0085 int frequency; // Hz 0086 int symbolRate; // symbols per second 0087 }; 0088 0089 class DvbSTransponder : public DvbTransponderBase 0090 { 0091 public: 0092 enum Polarization { 0093 Horizontal = 0, 0094 Vertical = 1, 0095 CircularLeft = 2, 0096 CircularRight = 3, 0097 Off = 4, 0098 }; 0099 0100 void readTransponder(QDataStream &stream); 0101 bool fromString(const QString &string); 0102 QString toString() const; 0103 bool corresponds(const DvbTransponder &transponder) const; 0104 0105 Polarization polarization : 8; 0106 FecRate fecRate : 8; 0107 int frequency; // kHz 0108 int symbolRate; // symbols per second 0109 }; 0110 0111 class DvbS2Transponder : public DvbSTransponder 0112 { 0113 public: 0114 enum Modulation { 0115 Qpsk = 0, 0116 Psk8 = 1, 0117 Apsk16 = 2, 0118 Apsk32 = 3, 0119 ModulationAuto = 4 0120 }; 0121 0122 enum RollOff { 0123 RollOff20 = 0, 0124 RollOff25 = 1, 0125 RollOff35 = 2, 0126 RollOffAuto = 3 0127 }; 0128 0129 void readTransponder(QDataStream &stream); 0130 bool fromString(const QString &string); 0131 QString toString() const; 0132 bool corresponds(const DvbTransponder &transponder) const; 0133 0134 Modulation modulation : 8; 0135 RollOff rollOff : 8; 0136 // FIXME: add stream ID 0137 }; 0138 0139 class DvbTTransponder : public DvbTransponderBase 0140 { 0141 public: 0142 enum Bandwidth { 0143 Bandwidth6MHz = 0, 0144 Bandwidth7MHz = 1, 0145 Bandwidth8MHz = 2, 0146 Bandwidth5MHz = 3, // Used only on DVB-T2, but present on Terrestrial descriptor 0147 BandwidthAuto = 4 0148 }; 0149 0150 enum Modulation { 0151 Qpsk = 0, 0152 Qam16 = 1, 0153 Qam64 = 2, 0154 ModulationAuto = 3 0155 }; 0156 0157 enum TransmissionMode { 0158 TransmissionMode2k = 0, 0159 TransmissionMode4k = 3, 0160 TransmissionMode8k = 1, 0161 TransmissionModeAuto = 2 0162 }; 0163 0164 enum GuardInterval { 0165 GuardInterval1_4 = 0, 0166 GuardInterval1_8 = 1, 0167 GuardInterval1_16 = 2, 0168 GuardInterval1_32 = 3, 0169 GuardIntervalAuto = 4 0170 }; 0171 0172 enum Hierarchy { 0173 HierarchyNone = 0, 0174 Hierarchy1 = 1, 0175 Hierarchy2 = 2, 0176 Hierarchy4 = 3, 0177 HierarchyAuto = 4 0178 }; 0179 0180 void readTransponder(QDataStream &stream); 0181 bool fromString(const QString &string); 0182 QString toString() const; 0183 bool corresponds(const DvbTransponder &transponder) const; 0184 0185 Bandwidth bandwidth : 8; 0186 Modulation modulation : 8; 0187 FecRate fecRateHigh : 8; // high priority stream 0188 FecRate fecRateLow : 8; // low priority stream 0189 TransmissionMode transmissionMode : 8; 0190 GuardInterval guardInterval : 8; 0191 Hierarchy hierarchy : 8; 0192 int frequency; // Hz 0193 }; 0194 0195 class DvbT2Transponder : public DvbTransponderBase 0196 { 0197 public: 0198 enum Bandwidth { 0199 Bandwidth6MHz = 0, 0200 Bandwidth7MHz = 1, 0201 Bandwidth8MHz = 2, 0202 Bandwidth5MHz = 3, 0203 Bandwidth1_7MHz = 4, 0204 Bandwidth10MHz = 5, 0205 BandwidthAuto = 6 0206 }; 0207 0208 enum Modulation { 0209 Qpsk = 0, 0210 Qam16 = 1, 0211 Qam64 = 2, 0212 Qam256 = 3, 0213 ModulationAuto = 4 0214 }; 0215 0216 enum TransmissionMode { 0217 TransmissionMode1k = 0, 0218 TransmissionMode2k = 1, 0219 TransmissionMode4k = 2, 0220 TransmissionMode8k = 3, 0221 TransmissionMode16k = 4, 0222 TransmissionMode32k = 5, 0223 TransmissionModeAuto = 6 0224 }; 0225 0226 enum GuardInterval { 0227 GuardInterval1_4 = 0, 0228 GuardInterval19_128 = 1, 0229 GuardInterval1_8 = 2, 0230 GuardInterval19_256 = 3, 0231 GuardInterval1_16 = 4, 0232 GuardInterval1_32 = 5, 0233 GuardInterval1_128 = 6, 0234 GuardIntervalAuto = 7 0235 }; 0236 0237 enum Hierarchy { 0238 HierarchyNone = 0, 0239 Hierarchy1 = 1, 0240 Hierarchy2 = 2, 0241 Hierarchy4 = 3, 0242 HierarchyAuto = 4 0243 }; 0244 0245 void readTransponder(QDataStream &stream); 0246 bool fromString(const QString &string); 0247 QString toString() const; 0248 bool corresponds(const DvbTransponder &transponder) const; 0249 0250 Bandwidth bandwidth : 8; 0251 Modulation modulation : 8; 0252 FecRate fecRateHigh : 8; // high priority stream 0253 FecRate fecRateLow : 8; // low priority stream 0254 TransmissionMode transmissionMode : 8; 0255 GuardInterval guardInterval : 8; 0256 Hierarchy hierarchy : 8; 0257 int streamId; // called as PLP at the DVB-T2 standard specs 0258 int frequency; // Hz 0259 }; 0260 0261 class AtscTransponder : public DvbTransponderBase 0262 { 0263 public: 0264 enum Modulation { 0265 Qam64 = 0, 0266 Qam256 = 1, 0267 Vsb8 = 2, 0268 Vsb16 = 3, 0269 ModulationAuto = 4 0270 }; 0271 0272 void readTransponder(QDataStream &stream); 0273 bool fromString(const QString &string); 0274 QString toString() const; 0275 bool corresponds(const DvbTransponder &transponder) const; 0276 0277 Modulation modulation : 8; 0278 int frequency; // Hz 0279 }; 0280 0281 class IsdbTTransponder : public DvbTransponderBase 0282 { 0283 public: 0284 enum Bandwidth { 0285 Bandwidth6MHz = 0, 0286 Bandwidth7MHz = 1, 0287 Bandwidth8MHz = 2, 0288 }; 0289 0290 enum Modulation { 0291 Qpsk = 0, 0292 Dqpsk = 1, 0293 Qam16 = 2, 0294 Qam64 = 3, 0295 ModulationAuto = 4 0296 }; 0297 0298 enum TransmissionMode { 0299 TransmissionMode2k = 0, 0300 TransmissionMode4k = 1, 0301 TransmissionMode8k = 2, 0302 TransmissionModeAuto = 3, 0303 }; 0304 0305 enum GuardInterval { 0306 GuardInterval1_4 = 0, 0307 GuardInterval1_8 = 1, 0308 GuardInterval1_16 = 2, 0309 GuardInterval1_32 = 3, 0310 GuardIntervalAuto = 4 0311 }; 0312 0313 enum Interleaving { 0314 I_0 = 0, 0315 I_1 = 1, 0316 I_2 = 2, 0317 I_4 = 4, 0318 I_8 = 8, 0319 I_16 = 16, /* Only on SB */ 0320 I_AUTO = 3 0321 }; 0322 0323 enum PartialReception { 0324 PR_disabled = 0, 0325 PR_enabled = 1, 0326 PR_AUTO = 2 0327 }; 0328 0329 enum SoundBroadcasting { 0330 SB_disabled = 0, 0331 SB_enabled = 1, 0332 SB_AUTO = 2 0333 }; 0334 0335 void readTransponder(QDataStream &stream); 0336 bool fromString(const QString &string); 0337 QString toString() const; 0338 bool corresponds(const DvbTransponder &transponder) const; 0339 0340 Bandwidth bandwidth : 8; 0341 TransmissionMode transmissionMode : 8; 0342 GuardInterval guardInterval : 8; 0343 PartialReception partialReception : 2; 0344 SoundBroadcasting soundBroadcasting : 2; 0345 int subChannelId; 0346 int sbSegmentCount; 0347 int sbSegmentIdx; 0348 0349 /* Per-Layer parameters */ 0350 bool layerEnabled[3]; 0351 FecRate fecRate[3]; 0352 Modulation modulation[3]; 0353 int segmentCount[3]; 0354 Interleaving interleaving[3]; 0355 0356 int frequency; // Hz 0357 }; 0358 0359 class DvbTransponder 0360 { 0361 public: 0362 DvbTransponder() 0363 { 0364 data.transmissionType = DvbTransponderBase::Invalid; 0365 } 0366 0367 explicit DvbTransponder(DvbTransponderBase::TransmissionType transmissionType_) 0368 { 0369 memset(&data, 0, sizeof(data)); 0370 data.transmissionType = transmissionType_; 0371 } 0372 0373 ~DvbTransponder() { } 0374 0375 DvbTransponderBase::TransmissionType getTransmissionType() const 0376 { 0377 return data.transmissionType; 0378 } 0379 0380 void setTransmissionType(const DvbTransponderBase::TransmissionType type) 0381 { 0382 data.transmissionType = type; 0383 } 0384 0385 bool isValid() const 0386 { 0387 return (data.transmissionType != DvbTransponderBase::Invalid); 0388 } 0389 0390 int frequency(); 0391 0392 static DvbTransponder fromString(const QString &string); // linuxtv scan file format 0393 QString toString() const; // linuxtv scan file format 0394 0395 /* 0396 * corresponding in this context means that both tuning parameters will lead to the same 0397 * transponder; note the tuning parameters don't have to be equal, it's sufficient that 0398 * they can't coexist at the same time (for example the frequency difference between two 0399 * channels in the same network has to be big enough because of bandwidth) 0400 */ 0401 0402 bool corresponds(const DvbTransponder &transponder) const; 0403 0404 template<class T> const T *as() const 0405 { 0406 if (data.transmissionType == transmissionTypeFor(static_cast<T *>(NULL))) { 0407 return reinterpret_cast<const T *>(&data); 0408 } 0409 0410 return NULL; 0411 } 0412 0413 template<class T> T *as() 0414 { 0415 if (data.transmissionType == transmissionTypeFor(static_cast<T *>(NULL))) { 0416 return reinterpret_cast<T *>(&data); 0417 } 0418 0419 return NULL; 0420 } 0421 0422 private: 0423 DvbTransponderBase::TransmissionType transmissionTypeFor(const DvbCTransponder *) const 0424 { 0425 return DvbTransponderBase::DvbC; 0426 } 0427 0428 DvbTransponderBase::TransmissionType transmissionTypeFor(const DvbSTransponder *) const 0429 { 0430 return DvbTransponderBase::DvbS; 0431 } 0432 0433 DvbTransponderBase::TransmissionType transmissionTypeFor(const DvbS2Transponder *) const 0434 { 0435 return DvbTransponderBase::DvbS2; 0436 } 0437 0438 DvbTransponderBase::TransmissionType transmissionTypeFor(const DvbTTransponder *) const 0439 { 0440 return DvbTransponderBase::DvbT; 0441 } 0442 0443 DvbTransponderBase::TransmissionType transmissionTypeFor(const DvbT2Transponder *) const 0444 { 0445 return DvbTransponderBase::DvbT2; 0446 } 0447 0448 DvbTransponderBase::TransmissionType transmissionTypeFor(const AtscTransponder *) const 0449 { 0450 return DvbTransponderBase::Atsc; 0451 } 0452 0453 DvbTransponderBase::TransmissionType transmissionTypeFor(const IsdbTTransponder *) const 0454 { 0455 return DvbTransponderBase::IsdbT; 0456 } 0457 union { 0458 DvbTransponderBase::TransmissionType transmissionType : 8; 0459 DvbCTransponder dvbCTransponder; 0460 DvbSTransponder dvbSTransponder; 0461 DvbS2Transponder dvbS2Transponder; 0462 DvbTTransponder dvbTTransponder; 0463 DvbT2Transponder dvbT2Transponder; 0464 AtscTransponder atscTransponder; 0465 IsdbTTransponder isdbTTransponder; 0466 } data; 0467 }; 0468 0469 #endif /* DVBTRANSPONDER_H */