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 */