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