1 /* 2 * dvbtransponder.h 3 * 4 * Copyright (C) 2007-2011 Christoph Pfister <christophpfister@gmail.com> 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License along 17 * with this program; if not, write to the Free Software Foundation, Inc., 18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19 */ 20 21 #ifndef DVBTRANSPONDER_H 22 #define DVBTRANSPONDER_H 23 24 #include <string.h> 25 26 class QDataStream; 27 class QString; 28 class DvbTransponder; 29 30 class DvbTransponderBase 31 { 32 public: 33 enum TransmissionType { 34 Invalid = 7, 35 DvbC = 0, 36 DvbS = 1, 37 DvbS2 = 4, 38 DvbT = 2, 39 DvbT2 = 6, 40 Atsc = 3, 41 IsdbT = 5, 42 }; 43 44 enum FecRate { 45 FecNone = 0, 46 Fec1_2 = 1, 47 Fec1_3 = 10, 48 Fec1_4 = 11, 49 Fec2_3 = 2, 50 Fec2_5 = 12, 51 Fec3_4 = 3, 52 Fec3_5 = 13, 53 Fec4_5 = 4, 54 Fec5_6 = 5, 55 Fec6_7 = 6, 56 Fec7_8 = 7, 57 Fec8_9 = 8, 58 Fec9_10 = 14, 59 FecAuto = 9 60 }; 61 62 protected: 63 TransmissionType transmissionType : 8; 64 }; 65 66 class DvbCTransponder : public DvbTransponderBase 67 { 68 public: 69 enum Modulation { 70 Qam16 = 0, 71 Qam32 = 1, 72 Qam64 = 2, 73 Qam128 = 3, 74 Qam256 = 4, 75 ModulationAuto = 5 76 }; 77 78 void readTransponder(QDataStream &stream); 79 bool fromString(const QString &string); 80 QString toString() const; 81 bool corresponds(const DvbTransponder &transponder) const; 82 83 Modulation modulation : 8; 84 FecRate fecRate : 8; 85 int frequency; // Hz 86 int symbolRate; // symbols per second 87 }; 88 89 class DvbSTransponder : public DvbTransponderBase 90 { 91 public: 92 enum Polarization { 93 Horizontal = 0, 94 Vertical = 1, 95 CircularLeft = 2, 96 CircularRight = 3, 97 Off = 4, 98 }; 99 100 void readTransponder(QDataStream &stream); 101 bool fromString(const QString &string); 102 QString toString() const; 103 bool corresponds(const DvbTransponder &transponder) const; 104 105 Polarization polarization : 8; 106 FecRate fecRate : 8; 107 int frequency; // kHz 108 int symbolRate; // symbols per second 109 }; 110 111 class DvbS2Transponder : public DvbSTransponder 112 { 113 public: 114 enum Modulation { 115 Qpsk = 0, 116 Psk8 = 1, 117 Apsk16 = 2, 118 Apsk32 = 3, 119 ModulationAuto = 4 120 }; 121 122 enum RollOff { 123 RollOff20 = 0, 124 RollOff25 = 1, 125 RollOff35 = 2, 126 RollOffAuto = 3 127 }; 128 129 void readTransponder(QDataStream &stream); 130 bool fromString(const QString &string); 131 QString toString() const; 132 bool corresponds(const DvbTransponder &transponder) const; 133 134 Modulation modulation : 8; 135 RollOff rollOff : 8; 136 // FIXME: add stream ID 137 }; 138 139 class DvbTTransponder : public DvbTransponderBase 140 { 141 public: 142 enum Bandwidth { 143 Bandwidth6MHz = 0, 144 Bandwidth7MHz = 1, 145 Bandwidth8MHz = 2, 146 Bandwidth5MHz = 3, // Used only on DVB-T2, but present on Terrestrial descriptor 147 BandwidthAuto = 4 148 }; 149 150 enum Modulation { 151 Qpsk = 0, 152 Qam16 = 1, 153 Qam64 = 2, 154 ModulationAuto = 3 155 }; 156 157 enum TransmissionMode { 158 TransmissionMode2k = 0, 159 TransmissionMode4k = 3, 160 TransmissionMode8k = 1, 161 TransmissionModeAuto = 2 162 }; 163 164 enum GuardInterval { 165 GuardInterval1_4 = 0, 166 GuardInterval1_8 = 1, 167 GuardInterval1_16 = 2, 168 GuardInterval1_32 = 3, 169 GuardIntervalAuto = 4 170 }; 171 172 enum Hierarchy { 173 HierarchyNone = 0, 174 Hierarchy1 = 1, 175 Hierarchy2 = 2, 176 Hierarchy4 = 3, 177 HierarchyAuto = 4 178 }; 179 180 void readTransponder(QDataStream &stream); 181 bool fromString(const QString &string); 182 QString toString() const; 183 bool corresponds(const DvbTransponder &transponder) const; 184 185 Bandwidth bandwidth : 8; 186 Modulation modulation : 8; 187 FecRate fecRateHigh : 8; // high priority stream 188 FecRate fecRateLow : 8; // low priority stream 189 TransmissionMode transmissionMode : 8; 190 GuardInterval guardInterval : 8; 191 Hierarchy hierarchy : 8; 192 int frequency; // Hz 193 }; 194 195 class DvbT2Transponder : public DvbTransponderBase 196 { 197 public: 198 enum Bandwidth { 199 Bandwidth6MHz = 0, 200 Bandwidth7MHz = 1, 201 Bandwidth8MHz = 2, 202 Bandwidth5MHz = 3, 203 Bandwidth1_7MHz = 4, 204 Bandwidth10MHz = 5, 205 BandwidthAuto = 6 206 }; 207 208 enum Modulation { 209 Qpsk = 0, 210 Qam16 = 1, 211 Qam64 = 2, 212 Qam256 = 3, 213 ModulationAuto = 4 214 }; 215 216 enum TransmissionMode { 217 TransmissionMode1k = 0, 218 TransmissionMode2k = 1, 219 TransmissionMode4k = 2, 220 TransmissionMode8k = 3, 221 TransmissionMode16k = 4, 222 TransmissionMode32k = 5, 223 TransmissionModeAuto = 6 224 }; 225 226 enum GuardInterval { 227 GuardInterval1_4 = 0, 228 GuardInterval19_128 = 1, 229 GuardInterval1_8 = 2, 230 GuardInterval19_256 = 3, 231 GuardInterval1_16 = 4, 232 GuardInterval1_32 = 5, 233 GuardInterval1_128 = 6, 234 GuardIntervalAuto = 7 235 }; 236 237 enum Hierarchy { 238 HierarchyNone = 0, 239 Hierarchy1 = 1, 240 Hierarchy2 = 2, 241 Hierarchy4 = 3, 242 HierarchyAuto = 4 243 }; 244 245 void readTransponder(QDataStream &stream); 246 bool fromString(const QString &string); 247 QString toString() const; 248 bool corresponds(const DvbTransponder &transponder) const; 249 250 Bandwidth bandwidth : 8; 251 Modulation modulation : 8; 252 FecRate fecRateHigh : 8; // high priority stream 253 FecRate fecRateLow : 8; // low priority stream 254 TransmissionMode transmissionMode : 8; 255 GuardInterval guardInterval : 8; 256 Hierarchy hierarchy : 8; 257 int streamId; // called as PLP at the DVB-T2 standard specs 258 int frequency; // Hz 259 }; 260 261 class AtscTransponder : public DvbTransponderBase 262 { 263 public: 264 enum Modulation { 265 Qam64 = 0, 266 Qam256 = 1, 267 Vsb8 = 2, 268 Vsb16 = 3, 269 ModulationAuto = 4 270 }; 271 272 void readTransponder(QDataStream &stream); 273 bool fromString(const QString &string); 274 QString toString() const; 275 bool corresponds(const DvbTransponder &transponder) const; 276 277 Modulation modulation : 8; 278 int frequency; // Hz 279 }; 280 281 class IsdbTTransponder : public DvbTransponderBase 282 { 283 public: 284 enum Bandwidth { 285 Bandwidth6MHz = 0, 286 Bandwidth7MHz = 1, 287 Bandwidth8MHz = 2, 288 }; 289 290 enum Modulation { 291 Qpsk = 0, 292 Dqpsk = 1, 293 Qam16 = 2, 294 Qam64 = 3, 295 ModulationAuto = 4 296 }; 297 298 enum TransmissionMode { 299 TransmissionMode2k = 0, 300 TransmissionMode4k = 1, 301 TransmissionMode8k = 2, 302 TransmissionModeAuto = 3, 303 }; 304 305 enum GuardInterval { 306 GuardInterval1_4 = 0, 307 GuardInterval1_8 = 1, 308 GuardInterval1_16 = 2, 309 GuardInterval1_32 = 3, 310 GuardIntervalAuto = 4 311 }; 312 313 enum Interleaving { 314 I_0 = 0, 315 I_1 = 1, 316 I_2 = 2, 317 I_4 = 4, 318 I_8 = 8, 319 I_16 = 16, /* Only on SB */ 320 I_AUTO = 3 321 }; 322 323 enum PartialReception { 324 PR_disabled = 0, 325 PR_enabled = 1, 326 PR_AUTO = 2 327 }; 328 329 enum SoundBroadcasting { 330 SB_disabled = 0, 331 SB_enabled = 1, 332 SB_AUTO = 2 333 }; 334 335 void readTransponder(QDataStream &stream); 336 bool fromString(const QString &string); 337 QString toString() const; 338 bool corresponds(const DvbTransponder &transponder) const; 339 340 Bandwidth bandwidth : 8; 341 TransmissionMode transmissionMode : 8; 342 GuardInterval guardInterval : 8; 343 PartialReception partialReception : 2; 344 SoundBroadcasting soundBroadcasting : 2; 345 int subChannelId; 346 int sbSegmentCount; 347 int sbSegmentIdx; 348 349 /* Per-Layer parameters */ 350 bool layerEnabled[3]; 351 FecRate fecRate[3]; 352 Modulation modulation[3]; 353 int segmentCount[3]; 354 Interleaving interleaving[3]; 355 356 int frequency; // Hz 357 }; 358 359 class DvbTransponder 360 { 361 public: DvbTransponder()362 DvbTransponder() 363 { 364 data.transmissionType = DvbTransponderBase::Invalid; 365 } 366 DvbTransponder(DvbTransponderBase::TransmissionType transmissionType_)367 explicit DvbTransponder(DvbTransponderBase::TransmissionType transmissionType_) 368 { 369 memset(&data, 0, sizeof(data)); 370 data.transmissionType = transmissionType_; 371 } 372 ~DvbTransponder()373 ~DvbTransponder() { } 374 getTransmissionType()375 DvbTransponderBase::TransmissionType getTransmissionType() const 376 { 377 return data.transmissionType; 378 } 379 setTransmissionType(const DvbTransponderBase::TransmissionType type)380 void setTransmissionType(const DvbTransponderBase::TransmissionType type) 381 { 382 data.transmissionType = type; 383 } 384 isValid()385 bool isValid() const 386 { 387 return (data.transmissionType != DvbTransponderBase::Invalid); 388 } 389 390 int frequency(); 391 392 static DvbTransponder fromString(const QString &string); // linuxtv scan file format 393 QString toString() const; // linuxtv scan file format 394 395 /* 396 * corresponding in this context means that both tuning parameters will lead to the same 397 * transponder; note the tuning parameters don't have to be equal, it's sufficient that 398 * they can't coexist at the same time (for example the frequency difference between two 399 * channels in the same network has to be big enough because of bandwidth) 400 */ 401 402 bool corresponds(const DvbTransponder &transponder) const; 403 as()404 template<class T> const T *as() const 405 { 406 if (data.transmissionType == transmissionTypeFor(static_cast<T *>(NULL))) { 407 return reinterpret_cast<const T *>(&data); 408 } 409 410 return NULL; 411 } 412 as()413 template<class T> T *as() 414 { 415 if (data.transmissionType == transmissionTypeFor(static_cast<T *>(NULL))) { 416 return reinterpret_cast<T *>(&data); 417 } 418 419 return NULL; 420 } 421 422 private: transmissionTypeFor(const DvbCTransponder *)423 DvbTransponderBase::TransmissionType transmissionTypeFor(const DvbCTransponder *) const 424 { 425 return DvbTransponderBase::DvbC; 426 } 427 transmissionTypeFor(const DvbSTransponder *)428 DvbTransponderBase::TransmissionType transmissionTypeFor(const DvbSTransponder *) const 429 { 430 return DvbTransponderBase::DvbS; 431 } 432 transmissionTypeFor(const DvbS2Transponder *)433 DvbTransponderBase::TransmissionType transmissionTypeFor(const DvbS2Transponder *) const 434 { 435 return DvbTransponderBase::DvbS2; 436 } 437 transmissionTypeFor(const DvbTTransponder *)438 DvbTransponderBase::TransmissionType transmissionTypeFor(const DvbTTransponder *) const 439 { 440 return DvbTransponderBase::DvbT; 441 } 442 transmissionTypeFor(const DvbT2Transponder *)443 DvbTransponderBase::TransmissionType transmissionTypeFor(const DvbT2Transponder *) const 444 { 445 return DvbTransponderBase::DvbT2; 446 } 447 transmissionTypeFor(const AtscTransponder *)448 DvbTransponderBase::TransmissionType transmissionTypeFor(const AtscTransponder *) const 449 { 450 return DvbTransponderBase::Atsc; 451 } 452 transmissionTypeFor(const IsdbTTransponder *)453 DvbTransponderBase::TransmissionType transmissionTypeFor(const IsdbTTransponder *) const 454 { 455 return DvbTransponderBase::IsdbT; 456 } 457 union { 458 DvbTransponderBase::TransmissionType transmissionType : 8; 459 DvbCTransponder dvbCTransponder; 460 DvbSTransponder dvbSTransponder; 461 DvbS2Transponder dvbS2Transponder; 462 DvbTTransponder dvbTTransponder; 463 DvbT2Transponder dvbT2Transponder; 464 AtscTransponder atscTransponder; 465 IsdbTTransponder isdbTTransponder; 466 } data; 467 }; 468 469 #endif /* DVBTRANSPONDER_H */ 470