dvb: src: use correct unit in tuning-timeout prop description
[platform/upstream/gstreamer.git] / sys / dvb / gstdvbsrc.c
1 /* GStreamer DVB source
2  * Copyright (C) 2006 Zaheer Abbas Merali <zaheerabbas at merali
3  *                                         dot org>
4  * Copyright (C) 2014 Samsung Electronics. All rights reserved.
5  *     @Author: Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public
18  * License along with this library; if not, write to the
19  * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  */
22 /**
23  * SECTION:element-dvbsrc
24  * @title: dvbsrc
25  *
26  * dvbsrc can be used to capture media from DVB cards. Supported DTV
27  * broadcasting standards include DVB-T/C/S, ATSC, ISDB-T and DTMB.
28  *
29  * ## Example launch line
30  * |[
31  * gst-launch-1.0 dvbsrc modulation="QAM 64" trans-mode=8k bandwidth=8 frequency=514000000 code-rate-lp=AUTO code-rate-hp=2/3 guard=4  hierarchy=0 ! mpegtsdemux name=demux ! queue max-size-buffers=0 max-size-time=0 ! mpegvideoparse ! mpegvideoparse ! mpeg2dec ! xvimagesink demux. ! queue max-size-buffers=0 max-size-time=0 ! mpegaudioparse ! mpg123audiodec ! audioconvert ! pulsesink
32  * ]| Captures a full transport stream from DVB card 0 that is a DVB-T card at tuned frequency 514000000 Hz with other parameters as seen in the pipeline and renders the first TV program on the transport stream.
33  * |[
34  * gst-launch-1.0 dvbsrc modulation="QAM 64" trans-mode=8k bandwidth=8 frequency=514000000 code-rate-lp=AUTO code-rate-hp=2/3 guard=4  hierarchy=0 pids=100:256:257 ! mpegtsdemux name=demux ! queue max-size-buffers=0 max-size-time=0 ! mpegvideoparse ! mpeg2dec ! xvimagesink demux. ! queue max-size-buffers=0 max-size-time=0 ! mpegaudioparse ! mpg123audiodec ! audioconvert ! pulsesink
35  * ]| Captures and renders a transport stream from DVB card 0 that is a DVB-T card for a program at tuned frequency 514000000 Hz with PMT PID 100 and elementary stream PIDs of 256, 257 with other parameters as seen in the pipeline.
36  * |[
37  * gst-launch-1.0 dvbsrc polarity="h" frequency=11302000 symbol-rate=27500 diseqc-source=0 pids=50:102:103 ! mpegtsdemux name=demux ! queue max-size-buffers=0 max-size-time=0 ! mpegvideoparse ! mpeg2dec ! xvimagesink demux. ! queue max-size-buffers=0 max-size-time=0 ! mpegaudioparse ! mpg123audiodec ! audioconvert ! pulsesink
38  * ]| Captures and renders a transport stream from DVB card 0 that is a DVB-S card for a program at tuned frequency 11302000 kHz, symbol rate of 27500 kBd (kilo bauds) with PMT PID of 50 and elementary stream PIDs of 102 and 103.
39  * |[
40  * gst-launch-1.0 dvbsrc frequency=515142857 guard=16 trans-mode="8k" isdbt-layer-enabled=7 isdbt-partial-reception=1 isdbt-layera-fec="2/3" isdbt-layera-modulation="QPSK" isdbt-layera-segment-count=1 isdbt-layera-time-interleaving=4 isdbt-layerb-fec="3/4" isdbt-layerb-modulation="qam-64" isdbt-layerb-segment-count=12 isdbt-layerb-time-interleaving=2 isdbt-layerc-fec="1/2" isdbt-layerc-modulation="qam-64" isdbt-layerc-segment-count=0 isdbt-layerc-time-interleaving=0 delsys="isdb-t" ! tsdemux ! "video/x-h264" ! h264parse ! queue ! avdec_h264 ! videoconvert ! queue ! autovideosink
41  * ]| Captures and renders the video track of TV ParaĆ­ba HD (Globo affiliate) in Campina Grande, Brazil. This is an ISDB-T (Brazilian ISDB-Tb variant) broadcast.
42  * |[
43  *  gst-launch-1.0 dvbsrc frequency=503000000 delsys="atsc" modulation="8vsb" pids=48:49:52 ! decodebin name=dec dec. ! videoconvert ! autovideosink dec. ! audioconvert ! autoaudiosink
44  * ]| Captures and renders KOFY-HD in San Jose, California. This is an ATSC broadcast, PMT ID 48, Audio/Video elementary stream PIDs 49 and 52 respectively.
45  *
46  */
47
48 /*
49  * History of DVB_API_VERSION 5 minor changes
50  *
51  * API Addition/changes in reverse order (most recent first)
52  *
53  * Minor 10 (statistics properties)
54  *   DTV_STAT_*
55  *   FE_SCALE_*
56  *
57  * Minor 9
58  *   DTV_LNA
59  *   LNA_AUTO
60  *
61  * Minor 8
62  *   FE_CAN_MULTISTREAM
63  *   DTV_ISDBS_TS_ID_LEGACY (was DVB_ISDBS_TS_ID)
64  *   DTV_DVBT2_PLP_ID_LEGACY (was DVB_DVBT2_PLP_ID)
65  *   NO_STREAM_ID_FILTER
66  *   DTV_STREAM_ID
67  *   INTERLEAVING_AUTO
68  *
69  * Minor 7 (DTMB Support)
70  *   FEC_2_5
71  *   QAM_4_NR
72  *   TRANSMISSION_MODE_C1 / _C3780
73  *   GUARD_INTERVAL_PN420 / _PN595 / _PN945
74  *   INTERLEAVING_NONE / _240 / _720
75  *   DTV_INTERLEAVING
76  *   SYS_DTMB (Renamed from SYS_DMBTH but has safety #define)
77  *
78  * Minor 6 (ATSC-MH)
79  *   DTV_ATSCMH_* (for those not defined in later versions)
80  *
81  * Somewhere in between 5 and 6:
82  *   SYS_DVBC_ANNEX_A / _C (Safety #define for _AC => A)
83  *
84  * Minor 5 (Note : minimum version we support according to configure.ac)
85  *   DTV_ENUM_DELSYS
86  */
87
88 /* We know we have at least DVB_API_VERSION >= 5 (minor 5) */
89 #define HAVE_V5_MINOR(minor) ((DVB_API_VERSION > 5) || \
90                               (DVB_API_VERSION_MINOR >= (minor)))
91
92 #ifdef HAVE_CONFIG_H
93 #include "config.h"
94 #endif
95
96 #include "gstdvbsrc.h"
97 #include <gst/gst.h>
98 #include <gst/glib-compat-private.h>
99 #include <sys/ioctl.h>
100 #include <sys/poll.h>
101 #include <fcntl.h>
102 #include <errno.h>
103 #include <stdio.h>
104 #include <stdlib.h>
105 #include <string.h>
106
107 #include <unistd.h>
108
109 #include <linux/dvb/version.h>
110 #include <linux/dvb/frontend.h>
111 #include <linux/dvb/dmx.h>
112
113 #include <gst/gst-i18n-plugin.h>
114
115 /* Before 5.6 we map A to AC */
116 #if !HAVE_V5_MINOR(6)
117 #define SYS_DVBC_ANNEX_A SYS_DVBC_ANNEX_AC
118 #endif
119
120 /* NO_STREAM_ID_FILTER & DTV_STREAMID introduced in minor 8 */
121 #ifndef NO_STREAM_ID_FILTER
122 #define NO_STREAM_ID_FILTER    (~0U)
123 #endif
124 #ifndef DTV_STREAM_ID
125 #define DTV_STREAM_ID DTV_ISDBS_TS_ID
126 #endif
127
128 GST_DEBUG_CATEGORY_STATIC (gstdvbsrc_debug);
129 #define GST_CAT_DEFAULT (gstdvbsrc_debug)
130
131 /**
132  * NUM_DTV_PROPS:
133  *
134  * Can't be greater than DTV_IOCTL_MAX_MSGS but we are
135  * not using more than 25 for the largest use case (ISDB-T).
136  *
137  * Bump as needed.
138  */
139 #define NUM_DTV_PROPS 25
140
141 /* Signals */
142 enum
143 {
144   SIGNAL_TUNING_START,
145   SIGNAL_TUNING_DONE,
146   SIGNAL_TUNING_FAIL,
147   SIGNAL_TUNE,
148   LAST_SIGNAL
149 };
150
151 /* Arguments */
152 enum
153 {
154   ARG_0,
155   ARG_DVBSRC_ADAPTER,
156   ARG_DVBSRC_FRONTEND,
157   ARG_DVBSRC_DISEQC_SRC,
158   ARG_DVBSRC_FREQUENCY,
159   ARG_DVBSRC_POLARITY,
160   ARG_DVBSRC_PIDS,
161   ARG_DVBSRC_SYM_RATE,
162   ARG_DVBSRC_BANDWIDTH,
163   ARG_DVBSRC_CODE_RATE_HP,
164   ARG_DVBSRC_CODE_RATE_LP,
165   ARG_DVBSRC_GUARD,
166   ARG_DVBSRC_MODULATION,
167   ARG_DVBSRC_TRANSMISSION_MODE,
168   ARG_DVBSRC_HIERARCHY_INF,
169   ARG_DVBSRC_TUNE,
170   ARG_DVBSRC_INVERSION,
171   ARG_DVBSRC_STATS_REPORTING_INTERVAL,
172   ARG_DVBSRC_TIMEOUT,
173   ARG_DVBSRC_TUNING_TIMEOUT,
174   ARG_DVBSRC_DVB_BUFFER_SIZE,
175   ARG_DVBSRC_DELSYS,
176   ARG_DVBSRC_PILOT,
177   ARG_DVBSRC_ROLLOFF,
178   ARG_DVBSRC_STREAM_ID,
179   ARG_DVBSRC_BANDWIDTH_HZ,
180   ARG_DVBSRC_ISDBT_LAYER_ENABLED,
181   ARG_DVBSRC_ISDBT_PARTIAL_RECEPTION,
182   ARG_DVBSRC_ISDBT_SOUND_BROADCASTING,
183   ARG_DVBSRC_ISDBT_SB_SUBCHANNEL_ID,
184   ARG_DVBSRC_ISDBT_SB_SEGMENT_IDX,
185   ARG_DVBSRC_ISDBT_SB_SEGMENT_COUNT,
186   ARG_DVBSRC_ISDBT_LAYERA_FEC,
187   ARG_DVBSRC_ISDBT_LAYERA_MODULATION,
188   ARG_DVBSRC_ISDBT_LAYERA_SEGMENT_COUNT,
189   ARG_DVBSRC_ISDBT_LAYERA_TIME_INTERLEAVING,
190   ARG_DVBSRC_ISDBT_LAYERB_FEC,
191   ARG_DVBSRC_ISDBT_LAYERB_MODULATION,
192   ARG_DVBSRC_ISDBT_LAYERB_SEGMENT_COUNT,
193   ARG_DVBSRC_ISDBT_LAYERB_TIME_INTERLEAVING,
194   ARG_DVBSRC_ISDBT_LAYERC_FEC,
195   ARG_DVBSRC_ISDBT_LAYERC_MODULATION,
196   ARG_DVBSRC_ISDBT_LAYERC_SEGMENT_COUNT,
197   ARG_DVBSRC_ISDBT_LAYERC_TIME_INTERLEAVING,
198   ARG_DVBSRC_LNB_SLOF,
199   ARG_DVBSRC_LNB_LOF1,
200   ARG_DVBSRC_LNB_LOF2,
201   ARG_DVBSRC_INTERLEAVING
202 };
203
204 #define DEFAULT_ADAPTER 0
205 #define DEFAULT_FRONTEND 0
206 #define DEFAULT_DISEQC_SRC -1   /* disabled */
207 #define DEFAULT_FREQUENCY 0
208 #define DEFAULT_POLARITY "H"
209 #define DEFAULT_PIDS "8192"     /* Special value meaning 'all' PIDs */
210 #define DEFAULT_SYMBOL_RATE 0
211 #define DEFAULT_BANDWIDTH_HZ 8000000
212 #define DEFAULT_BANDWIDTH BANDWIDTH_8_MHZ
213 #define DEFAULT_CODE_RATE_HP FEC_AUTO
214 #define DEFAULT_CODE_RATE_LP FEC_1_2
215 #define DEFAULT_GUARD GUARD_INTERVAL_1_16
216 #define DEFAULT_MODULATION QAM_16
217 #define DEFAULT_TRANSMISSION_MODE TRANSMISSION_MODE_8K
218 #define DEFAULT_HIERARCHY HIERARCHY_1
219 #define DEFAULT_INVERSION INVERSION_ON
220 #define DEFAULT_STATS_REPORTING_INTERVAL 100
221 #define DEFAULT_TIMEOUT 1000000 /* 1 second */
222 #define DEFAULT_TUNING_TIMEOUT 10 * GST_SECOND  /* 10 seconds */
223 #define DEFAULT_DVB_BUFFER_SIZE (10*188*1024)   /* kernel default is 8192 */
224 #define DEFAULT_BUFFER_SIZE 8192        /* not a property */
225 #define DEFAULT_DELSYS SYS_UNDEFINED
226 #define DEFAULT_PILOT PILOT_AUTO
227 #define DEFAULT_ROLLOFF ROLLOFF_AUTO
228 #define DEFAULT_STREAM_ID NO_STREAM_ID_FILTER
229 #define DEFAULT_ISDBT_LAYER_ENABLED 7
230 #define DEFAULT_ISDBT_PARTIAL_RECEPTION 1
231 #define DEFAULT_ISDBT_SOUND_BROADCASTING 0
232 #define DEFAULT_ISDBT_SB_SUBCHANNEL_ID -1
233 #define DEFAULT_ISDBT_SB_SEGMENT_IDX 0
234 #define DEFAULT_ISDBT_SB_SEGMENT_COUNT 1
235 #define DEFAULT_ISDBT_LAYERA_FEC FEC_AUTO
236 #define DEFAULT_ISDBT_LAYERA_MODULATION QAM_AUTO
237 #define DEFAULT_ISDBT_LAYERA_SEGMENT_COUNT -1
238 #define DEFAULT_ISDBT_LAYERA_TIME_INTERLEAVING -1
239 #define DEFAULT_ISDBT_LAYERB_FEC FEC_AUTO
240 #define DEFAULT_ISDBT_LAYERB_MODULATION QAM_AUTO
241 #define DEFAULT_ISDBT_LAYERB_SEGMENT_COUNT -1
242 #define DEFAULT_ISDBT_LAYERB_TIME_INTERLEAVING -1
243 #define DEFAULT_ISDBT_LAYERC_FEC FEC_AUTO
244 #define DEFAULT_ISDBT_LAYERC_MODULATION QAM_AUTO
245 #define DEFAULT_ISDBT_LAYERC_SEGMENT_COUNT -1
246 #define DEFAULT_ISDBT_LAYERC_TIME_INTERLEAVING -1
247 #define DEFAULT_LNB_SLOF (11700*1000UL)
248 #define DEFAULT_LNB_LOF1 (9750*1000UL)
249 #define DEFAULT_LNB_LOF2 (10600*1000UL)
250 #if HAVE_V5_MINOR(7)
251 #define DEFAULT_INTERLEAVING INTERLEAVING_AUTO
252 #else
253 #define DEFAULT_INTERLEAVING 0
254 #endif
255
256 static void gst_dvbsrc_output_frontend_stats (GstDvbSrc * src);
257
258 #define GST_TYPE_DVBSRC_CODE_RATE (gst_dvbsrc_code_rate_get_type ())
259 static GType
260 gst_dvbsrc_code_rate_get_type (void)
261 {
262   static GType dvbsrc_code_rate_type = 0;
263   static const GEnumValue code_rate_types[] = {
264     {FEC_NONE, "NONE", "none"},
265     {FEC_1_2, "1/2", "1/2"},
266     {FEC_2_3, "2/3", "2/3"},
267     {FEC_3_4, "3/4", "3/4"},
268     {FEC_4_5, "4/5", "4/5"},
269     {FEC_5_6, "5/6", "5/6"},
270     {FEC_6_7, "6/7", "6/7"},
271     {FEC_7_8, "7/8", "7/8"},
272     {FEC_8_9, "8/9", "8/9"},
273     {FEC_AUTO, "AUTO", "auto"},
274     {FEC_3_5, "3/5", "3/5"},
275     {FEC_9_10, "9/10", "9/10"},
276 #if HAVE_V5_MINOR(7)
277     {FEC_2_5, "2/5", "2/5"},
278 #endif
279     {0, NULL, NULL},
280   };
281
282   if (!dvbsrc_code_rate_type) {
283     dvbsrc_code_rate_type =
284         g_enum_register_static ("GstDvbSrcCode_Rate", code_rate_types);
285   }
286   return dvbsrc_code_rate_type;
287 }
288
289 #define GST_TYPE_DVBSRC_MODULATION (gst_dvbsrc_modulation_get_type ())
290 static GType
291 gst_dvbsrc_modulation_get_type (void)
292 {
293   static GType dvbsrc_modulation_type = 0;
294   static const GEnumValue modulation_types[] = {
295     {QPSK, "QPSK", "qpsk"},
296     {QAM_16, "QAM 16", "qam-16"},
297     {QAM_32, "QAM 32", "qam-32"},
298     {QAM_64, "QAM 64", "qam-64"},
299     {QAM_128, "QAM 128", "qam-128"},
300     {QAM_256, "QAM 256", "qam-256"},
301     {QAM_AUTO, "AUTO", "auto"},
302     {VSB_8, "8VSB", "8vsb"},
303     {VSB_16, "16VSB", "16vsb"},
304     {PSK_8, "8PSK", "8psk"},
305     {APSK_16, "16APSK", "16apsk"},
306     {APSK_32, "32APSK", "32apsk"},
307     {DQPSK, "DQPSK", "dqpsk"},
308     {QAM_4_NR, "QAM 4 NR", "qam-4-nr"},
309     {0, NULL, NULL},
310   };
311
312   if (!dvbsrc_modulation_type) {
313     dvbsrc_modulation_type =
314         g_enum_register_static ("GstDvbSrcModulation", modulation_types);
315   }
316   return dvbsrc_modulation_type;
317 }
318
319 #define GST_TYPE_DVBSRC_TRANSMISSION_MODE (gst_dvbsrc_transmission_mode_get_type ())
320 static GType
321 gst_dvbsrc_transmission_mode_get_type (void)
322 {
323   static GType dvbsrc_transmission_mode_type = 0;
324   static const GEnumValue transmission_mode_types[] = {
325     {TRANSMISSION_MODE_2K, "2K", "2k"},
326     {TRANSMISSION_MODE_8K, "8K", "8k"},
327     {TRANSMISSION_MODE_AUTO, "AUTO", "auto"},
328     {TRANSMISSION_MODE_4K, "4K", "4k"},
329     {TRANSMISSION_MODE_1K, "1K", "1k"},
330     {TRANSMISSION_MODE_16K, "16K", "16k"},
331     {TRANSMISSION_MODE_32K, "32K", "32k"},
332 #if HAVE_V5_MINOR(7)
333     {TRANSMISSION_MODE_C1, "C1", "c1"},
334     {TRANSMISSION_MODE_C3780, "C3780", "c3780"},
335 #endif
336     {0, NULL, NULL},
337   };
338
339   if (!dvbsrc_transmission_mode_type) {
340     dvbsrc_transmission_mode_type =
341         g_enum_register_static ("GstDvbSrcTransmission_Mode",
342         transmission_mode_types);
343   }
344   return dvbsrc_transmission_mode_type;
345 }
346
347 #define GST_TYPE_DVBSRC_BANDWIDTH (gst_dvbsrc_bandwidth_get_type ())
348 static GType
349 gst_dvbsrc_bandwidth_get_type (void)
350 {
351   static GType dvbsrc_bandwidth_type = 0;
352   static const GEnumValue bandwidth_types[] = {
353     {BANDWIDTH_8_MHZ, "8", "8"},
354     {BANDWIDTH_7_MHZ, "7", "7"},
355     {BANDWIDTH_6_MHZ, "6", "6"},
356     {BANDWIDTH_AUTO, "AUTO", "AUTO"},
357     {BANDWIDTH_5_MHZ, "5", "5"},
358     {BANDWIDTH_10_MHZ, "10", "10"},
359     {BANDWIDTH_1_712_MHZ, "1.712", "1.712"},
360     {0, NULL, NULL},
361   };
362
363   if (!dvbsrc_bandwidth_type) {
364     dvbsrc_bandwidth_type =
365         g_enum_register_static ("GstDvbSrcBandwidth", bandwidth_types);
366   }
367   return dvbsrc_bandwidth_type;
368 }
369
370 #define GST_TYPE_DVBSRC_GUARD (gst_dvbsrc_guard_get_type ())
371 static GType
372 gst_dvbsrc_guard_get_type (void)
373 {
374   static GType dvbsrc_guard_type = 0;
375   static const GEnumValue guard_types[] = {
376     {GUARD_INTERVAL_1_32, "32", "32"},
377     {GUARD_INTERVAL_1_16, "16", "16"},
378     {GUARD_INTERVAL_1_8, "8", "8"},
379     {GUARD_INTERVAL_1_4, "4", "4"},
380     {GUARD_INTERVAL_AUTO, "AUTO", "auto"},
381     {GUARD_INTERVAL_1_128, "128", "128"},
382     {GUARD_INTERVAL_19_128, "19/128", "19/128"},
383     {GUARD_INTERVAL_19_256, "19/256", "19/256"},
384 #if HAVE_V5_MINOR(7)
385     {GUARD_INTERVAL_PN420, "PN420", "pn420"},
386     {GUARD_INTERVAL_PN595, "PN595", "pn595"},
387     {GUARD_INTERVAL_PN945, "PN945", "pn945"},
388 #endif
389     {0, NULL, NULL},
390   };
391
392   if (!dvbsrc_guard_type) {
393     dvbsrc_guard_type = g_enum_register_static ("GstDvbSrcGuard", guard_types);
394   }
395   return dvbsrc_guard_type;
396 }
397
398 #define GST_TYPE_DVBSRC_HIERARCHY (gst_dvbsrc_hierarchy_get_type ())
399 static GType
400 gst_dvbsrc_hierarchy_get_type (void)
401 {
402   static GType dvbsrc_hierarchy_type = 0;
403   static const GEnumValue hierarchy_types[] = {
404     {HIERARCHY_NONE, "NONE", "none"},
405     {HIERARCHY_1, "1", "1"},
406     {HIERARCHY_2, "2", "2"},
407     {HIERARCHY_4, "4", "4"},
408     {HIERARCHY_AUTO, "AUTO", "auto"},
409     {0, NULL, NULL},
410   };
411
412   if (!dvbsrc_hierarchy_type) {
413     dvbsrc_hierarchy_type =
414         g_enum_register_static ("GstDvbSrcHierarchy", hierarchy_types);
415   }
416   return dvbsrc_hierarchy_type;
417 }
418
419 #define GST_TYPE_DVBSRC_INVERSION (gst_dvbsrc_inversion_get_type ())
420 static GType
421 gst_dvbsrc_inversion_get_type (void)
422 {
423   static GType dvbsrc_inversion_type = 0;
424   static const GEnumValue inversion_types[] = {
425     {INVERSION_OFF, "OFF", "off"},
426     {INVERSION_ON, "ON", "on"},
427     {INVERSION_AUTO, "AUTO", "auto"},
428     {0, NULL, NULL},
429   };
430
431   if (!dvbsrc_inversion_type) {
432     dvbsrc_inversion_type =
433         g_enum_register_static ("GstDvbSrcInversion", inversion_types);
434   }
435   return dvbsrc_inversion_type;
436 }
437
438 #define GST_TYPE_DVBSRC_DELSYS (gst_dvbsrc_delsys_get_type ())
439 static GType
440 gst_dvbsrc_delsys_get_type (void)
441 {
442   static GType dvbsrc_delsys_type = 0;
443   static const GEnumValue delsys_types[] = {
444     {SYS_UNDEFINED, "UNDEFINED", "undefined"},
445     {SYS_DVBC_ANNEX_A, "DVB-C-A", "dvb-c-a"},
446     {SYS_DVBC_ANNEX_B, "DVB-C-B", "dvb-c-b"},
447     {SYS_DVBT, "DVB-T", "dvb-t"},
448     {SYS_DSS, "DSS", "dss"},
449     {SYS_DVBS, "DVB-S", "dvb-s"},
450     {SYS_DVBS2, "DVB-S2", "dvb-s2"},
451     {SYS_DVBH, "DVB-H", "dvb-h"},
452     {SYS_ISDBT, "ISDB-T", "isdb-t"},
453     {SYS_ISDBS, "ISDB-S", "isdb-s"},
454     {SYS_ISDBC, "ISDB-C", "isdb-c"},
455     {SYS_ATSC, "ATSC", "atsc"},
456     {SYS_ATSCMH, "ATSC-MH", "atsc-mh"},
457 #if HAVE_V5_MINOR(7)
458     {SYS_DTMB, "DTMB", "dtmb"},
459 #endif
460     {SYS_CMMB, "CMMB", "cmmb"},
461     {SYS_DAB, "DAB", "dab"},
462     {SYS_DVBT2, "DVB-T2", "dvb-t2"},
463     {SYS_TURBO, "TURBO", "turbo"},
464 #if HAVE_V5_MINOR(6)
465     {SYS_DVBC_ANNEX_C, "DVB-C-C", "dvb-c-c"},
466 #endif
467     {0, NULL, NULL},
468   };
469
470   if (!dvbsrc_delsys_type) {
471     dvbsrc_delsys_type =
472         g_enum_register_static ("GstDvbSrcDelsys", delsys_types);
473   }
474   return dvbsrc_delsys_type;
475 }
476
477 #define GST_TYPE_DVBSRC_PILOT (gst_dvbsrc_pilot_get_type ())
478 static GType
479 gst_dvbsrc_pilot_get_type (void)
480 {
481   static GType dvbsrc_pilot_type = 0;
482   static const GEnumValue pilot_types[] = {
483     {PILOT_ON, "ON", "on"},
484     {PILOT_OFF, "OFF", "off"},
485     {PILOT_AUTO, "AUTO", "auto"},
486     {0, NULL, NULL},
487   };
488
489   if (!dvbsrc_pilot_type) {
490     dvbsrc_pilot_type = g_enum_register_static ("GstDvbSrcPilot", pilot_types);
491   }
492   return dvbsrc_pilot_type;
493 }
494
495 #define GST_TYPE_DVBSRC_ROLLOFF (gst_dvbsrc_rolloff_get_type ())
496 static GType
497 gst_dvbsrc_rolloff_get_type (void)
498 {
499   static GType dvbsrc_rolloff_type = 0;
500   static const GEnumValue rolloff_types[] = {
501     {ROLLOFF_35, "35", "35"},
502     {ROLLOFF_20, "20", "20"},
503     {ROLLOFF_25, "25", "25"},
504     {ROLLOFF_AUTO, "auto", "auto"},
505     {0, NULL, NULL},
506   };
507
508   if (!dvbsrc_rolloff_type) {
509     dvbsrc_rolloff_type =
510         g_enum_register_static ("GstDvbSrcRolloff", rolloff_types);
511   }
512   return dvbsrc_rolloff_type;
513 }
514
515 #define GST_TYPE_INTERLEAVING (gst_dvbsrc_interleaving_get_type ())
516 static GType
517 gst_dvbsrc_interleaving_get_type (void)
518 {
519   static GType dvbsrc_interleaving_type = 0;
520   static const GEnumValue interleaving_types[] = {
521 #if HAVE_V5_MINOR(7)
522     {INTERLEAVING_NONE, "NONE", "none"},
523     {INTERLEAVING_AUTO, "AUTO", "auto"},
524     {INTERLEAVING_240, "240", "240"},
525     {INTERLEAVING_720, "720", "720"},
526 #endif
527     {0, NULL, NULL},
528   };
529
530   if (!dvbsrc_interleaving_type) {
531     dvbsrc_interleaving_type =
532         g_enum_register_static ("GstDvbSrcInterleaving", interleaving_types);
533   }
534   return dvbsrc_interleaving_type;
535 }
536
537 static void gst_dvbsrc_finalize (GObject * object);
538 static void gst_dvbsrc_set_property (GObject * object, guint prop_id,
539     const GValue * value, GParamSpec * pspec);
540 static void gst_dvbsrc_get_property (GObject * object, guint prop_id,
541     GValue * value, GParamSpec * pspec);
542
543 static GstFlowReturn gst_dvbsrc_create (GstPushSrc * element,
544     GstBuffer ** buffer);
545
546 static gboolean gst_dvbsrc_start (GstBaseSrc * bsrc);
547 static gboolean gst_dvbsrc_stop (GstBaseSrc * bsrc);
548 static GstStateChangeReturn gst_dvbsrc_change_state (GstElement * element,
549     GstStateChange transition);
550
551 static gboolean gst_dvbsrc_unlock (GstBaseSrc * bsrc);
552 static gboolean gst_dvbsrc_unlock_stop (GstBaseSrc * bsrc);
553 static gboolean gst_dvbsrc_is_seekable (GstBaseSrc * bsrc);
554 static gboolean gst_dvbsrc_get_size (GstBaseSrc * src, guint64 * size);
555
556 static void gst_dvbsrc_do_tune (GstDvbSrc * src);
557 static gboolean gst_dvbsrc_tune (GstDvbSrc * object);
558 static gboolean gst_dvbsrc_set_fe_params (GstDvbSrc * object,
559     struct dtv_properties *props);
560 static void gst_dvbsrc_guess_delsys (GstDvbSrc * object);
561 static gboolean gst_dvbsrc_tune_fe (GstDvbSrc * object);
562
563 static void gst_dvbsrc_set_pes_filters (GstDvbSrc * object);
564 static void gst_dvbsrc_unset_pes_filters (GstDvbSrc * object);
565 static gboolean gst_dvbsrc_is_valid_modulation (guint delsys, guint mod);
566 static gboolean gst_dvbsrc_is_valid_trans_mode (guint delsys, guint mode);
567 static gboolean gst_dvbsrc_is_valid_bandwidth (guint delsys, guint bw);
568
569 /**
570  * LOOP_WHILE_EINTR:
571  *
572  * This loop should be safe enough considering:
573  *
574  * 1.- EINTR suggest the next ioctl might succeed
575  * 2.- It's highly unlikely you will end up spining
576  *     before your entire system goes nuts due to
577  *     the massive number of interrupts.
578  *
579  * We don't check for EAGAIN here cause we are opening
580  * the frontend in blocking mode.
581  */
582 #define LOOP_WHILE_EINTR(v,func) do { (v) = (func); } \
583                 while ((v) == -1 && errno == EINTR);
584
585 static GstStaticPadTemplate ts_src_factory = GST_STATIC_PAD_TEMPLATE ("src",
586     GST_PAD_SRC,
587     GST_PAD_ALWAYS,
588     GST_STATIC_CAPS
589     ("video/mpegts, "
590         "mpegversion = (int) 2," "systemstream = (boolean) TRUE"));
591
592 /*
593  ******************************
594  *                            *
595  *      GObject Related       *
596  *                            *
597  *                            *
598  ******************************
599  */
600
601 #define gst_dvbsrc_parent_class parent_class
602 G_DEFINE_TYPE (GstDvbSrc, gst_dvbsrc, GST_TYPE_PUSH_SRC);
603
604 static guint gst_dvbsrc_signals[LAST_SIGNAL] = { 0 };
605
606 /* initialize the plugin's class */
607 static void
608 gst_dvbsrc_class_init (GstDvbSrcClass * klass)
609 {
610   GObjectClass *gobject_class;
611   GstElementClass *gstelement_class;
612   GstBaseSrcClass *gstbasesrc_class;
613   GstPushSrcClass *gstpushsrc_class;
614   GstDvbSrcClass *gstdvbsrc_class;
615
616   gobject_class = (GObjectClass *) klass;
617   gstelement_class = (GstElementClass *) klass;
618   gstbasesrc_class = (GstBaseSrcClass *) klass;
619   gstpushsrc_class = (GstPushSrcClass *) klass;
620   gstdvbsrc_class = (GstDvbSrcClass *) klass;
621
622   gobject_class->set_property = gst_dvbsrc_set_property;
623   gobject_class->get_property = gst_dvbsrc_get_property;
624   gobject_class->finalize = gst_dvbsrc_finalize;
625
626   gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_dvbsrc_change_state);
627
628   gst_element_class_add_static_pad_template (gstelement_class, &ts_src_factory);
629
630   gst_element_class_set_static_metadata (gstelement_class, "DVB Source",
631       "Source/Video",
632       "Digital Video Broadcast Source",
633       "P2P-VCR, C-Lab, University of Paderborn, "
634       "Zaheer Abbas Merali <zaheerabbas at merali dot org>\n"
635       "Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>");
636
637   gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_dvbsrc_start);
638   gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_dvbsrc_stop);
639   gstbasesrc_class->unlock = GST_DEBUG_FUNCPTR (gst_dvbsrc_unlock);
640   gstbasesrc_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_dvbsrc_unlock_stop);
641   gstbasesrc_class->is_seekable = GST_DEBUG_FUNCPTR (gst_dvbsrc_is_seekable);
642   gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_dvbsrc_get_size);
643
644   gstpushsrc_class->create = GST_DEBUG_FUNCPTR (gst_dvbsrc_create);
645
646   gstdvbsrc_class->do_tune = GST_DEBUG_FUNCPTR (gst_dvbsrc_do_tune);
647
648   g_object_class_install_property (gobject_class, ARG_DVBSRC_ADAPTER,
649       g_param_spec_int ("adapter", "The adapter device number",
650           "The DVB adapter device number (eg. 0 for adapter0)",
651           0, 16, DEFAULT_ADAPTER, G_PARAM_READWRITE));
652
653   g_object_class_install_property (gobject_class, ARG_DVBSRC_FRONTEND,
654       g_param_spec_int ("frontend", "The frontend device number",
655           "The frontend device number (eg. 0 for frontend0)",
656           0, 16, DEFAULT_FRONTEND, G_PARAM_READWRITE));
657
658   g_object_class_install_property (gobject_class, ARG_DVBSRC_FREQUENCY,
659       g_param_spec_uint ("frequency", "Center frequency",
660           "Center frequency to tune into. Measured in kHz for the satellite "
661           "distribution standars and Hz for all the rest",
662           0, G_MAXUINT, DEFAULT_FREQUENCY,
663           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
664
665   g_object_class_install_property (gobject_class, ARG_DVBSRC_POLARITY,
666       g_param_spec_string ("polarity", "polarity",
667           "(DVB-S/S2) Polarity [vhHV] (eg. V for Vertical)",
668           DEFAULT_POLARITY,
669           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
670
671   g_object_class_install_property (gobject_class, ARG_DVBSRC_PIDS,
672       g_param_spec_string ("pids", "pids",
673           "Colon-separated list of PIDs (eg. 110:120) to capture. ACT and CAT "
674           "are automatically included but PMT should be added explicitly. "
675           "Special value 8192 gets full MPEG-TS",
676           DEFAULT_PIDS, GST_PARAM_MUTABLE_PLAYING | G_PARAM_WRITABLE));
677
678   g_object_class_install_property (gobject_class, ARG_DVBSRC_SYM_RATE,
679       g_param_spec_uint ("symbol-rate",
680           "symbol rate",
681           "(DVB-S/S2, DVB-C) Symbol rate in kBd (kilo bauds)",
682           0, G_MAXUINT, DEFAULT_SYMBOL_RATE,
683           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
684
685   g_object_class_install_property (gobject_class, ARG_DVBSRC_TUNE,
686       g_param_spec_pointer ("tune",
687           "tune", "Atomically tune to channel. (For Apps)", G_PARAM_WRITABLE));
688
689   g_object_class_install_property (gobject_class, ARG_DVBSRC_DISEQC_SRC,
690       g_param_spec_int ("diseqc-source",
691           "diseqc source",
692           "(DVB-S/S2) Selected DiSEqC source. Only needed if you have a "
693           "DiSEqC switch. Otherwise leave at -1 (disabled)", -1, 7,
694           DEFAULT_DISEQC_SRC, GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
695
696   g_object_class_install_property (gobject_class, ARG_DVBSRC_BANDWIDTH_HZ,
697       g_param_spec_uint ("bandwidth-hz", "bandwidth-hz",
698           "Channel bandwidth in Hz", 0, G_MAXUINT, DEFAULT_BANDWIDTH_HZ,
699           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
700
701 #ifndef GST_REMOVE_DEPRECATED
702   g_object_class_install_property (gobject_class, ARG_DVBSRC_BANDWIDTH,
703       g_param_spec_enum ("bandwidth", "bandwidth",
704           "(DVB-T) Bandwidth. Deprecated", GST_TYPE_DVBSRC_BANDWIDTH,
705           DEFAULT_BANDWIDTH,
706           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE | G_PARAM_DEPRECATED));
707 #endif
708
709   /* FIXME: DVB-C, DVB-S, DVB-S2 named it as innerFEC */
710   g_object_class_install_property (gobject_class, ARG_DVBSRC_CODE_RATE_HP,
711       g_param_spec_enum ("code-rate-hp",
712           "code-rate-hp",
713           "(DVB-T, DVB-S/S2 and DVB-C) High priority code rate",
714           GST_TYPE_DVBSRC_CODE_RATE, DEFAULT_CODE_RATE_HP,
715           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
716
717   g_object_class_install_property (gobject_class, ARG_DVBSRC_CODE_RATE_LP,
718       g_param_spec_enum ("code-rate-lp",
719           "code-rate-lp",
720           "(DVB-T) Low priority code rate",
721           GST_TYPE_DVBSRC_CODE_RATE, DEFAULT_CODE_RATE_LP,
722           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
723
724   /* FIXME: should the property be called 'guard-interval' then? */
725   g_object_class_install_property (gobject_class, ARG_DVBSRC_GUARD,
726       g_param_spec_enum ("guard",
727           "guard",
728           "(DVB-T) Guard Interval",
729           GST_TYPE_DVBSRC_GUARD, DEFAULT_GUARD,
730           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
731
732   g_object_class_install_property (gobject_class, ARG_DVBSRC_MODULATION,
733       g_param_spec_enum ("modulation", "modulation",
734           "(DVB-T/T2/C/S2, TURBO and ATSC) Modulation type",
735           GST_TYPE_DVBSRC_MODULATION, DEFAULT_MODULATION,
736           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
737
738   /* FIXME: property should be named 'transmission-mode' */
739   g_object_class_install_property (gobject_class,
740       ARG_DVBSRC_TRANSMISSION_MODE,
741       g_param_spec_enum ("trans-mode", "trans-mode",
742           "(DVB-T) Transmission mode",
743           GST_TYPE_DVBSRC_TRANSMISSION_MODE, DEFAULT_TRANSMISSION_MODE,
744           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
745
746   g_object_class_install_property (gobject_class, ARG_DVBSRC_HIERARCHY_INF,
747       g_param_spec_enum ("hierarchy", "hierarchy",
748           "(DVB-T) Hierarchy information",
749           GST_TYPE_DVBSRC_HIERARCHY, DEFAULT_HIERARCHY,
750           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
751
752   g_object_class_install_property (gobject_class, ARG_DVBSRC_INVERSION,
753       g_param_spec_enum ("inversion", "inversion",
754           "(DVB-T and DVB-C) Inversion information",
755           GST_TYPE_DVBSRC_INVERSION, DEFAULT_INVERSION,
756           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
757
758   g_object_class_install_property (gobject_class,
759       ARG_DVBSRC_STATS_REPORTING_INTERVAL,
760       g_param_spec_uint ("stats-reporting-interval",
761           "stats-reporting-interval",
762           "The number of reads before reporting frontend stats",
763           0, G_MAXUINT, DEFAULT_STATS_REPORTING_INTERVAL,
764           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
765
766   g_object_class_install_property (gobject_class, ARG_DVBSRC_TIMEOUT,
767       g_param_spec_uint64 ("timeout", "Timeout",
768           "Post a message after timeout microseconds (0 = disabled)",
769           0, G_MAXUINT64, DEFAULT_TIMEOUT, G_PARAM_READWRITE));
770
771   g_object_class_install_property (gobject_class, ARG_DVBSRC_TUNING_TIMEOUT,
772       g_param_spec_uint64 ("tuning-timeout", "Tuning Timeout",
773           "Microseconds to wait before giving up tuning/locking on a signal",
774           0, G_MAXUINT64, DEFAULT_TUNING_TIMEOUT,
775           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
776
777   g_object_class_install_property (gobject_class,
778       ARG_DVBSRC_DVB_BUFFER_SIZE,
779       g_param_spec_uint ("dvb-buffer-size",
780           "dvb-buffer-size",
781           "The kernel buffer size used by the DVB api",
782           0, G_MAXUINT, DEFAULT_DVB_BUFFER_SIZE, G_PARAM_READWRITE));
783
784   g_object_class_install_property (gobject_class, ARG_DVBSRC_DELSYS,
785       g_param_spec_enum ("delsys", "delsys", "Delivery System",
786           GST_TYPE_DVBSRC_DELSYS, DEFAULT_DELSYS, G_PARAM_READWRITE));
787
788   g_object_class_install_property (gobject_class, ARG_DVBSRC_PILOT,
789       g_param_spec_enum ("pilot", "pilot", "Pilot (DVB-S2)",
790           GST_TYPE_DVBSRC_PILOT, DEFAULT_PILOT,
791           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
792
793   g_object_class_install_property (gobject_class, ARG_DVBSRC_ROLLOFF,
794       g_param_spec_enum ("rolloff", "rolloff", "Rolloff (DVB-S2)",
795           GST_TYPE_DVBSRC_ROLLOFF, DEFAULT_ROLLOFF,
796           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
797
798   g_object_class_install_property (gobject_class, ARG_DVBSRC_STREAM_ID,
799       g_param_spec_int ("stream-id", "stream-id",
800           "(DVB-T2 and DVB-S2 max 255, ISDB max 65535) Stream ID "
801           "(-1 = disabled)", -1, 65535, DEFAULT_STREAM_ID,
802           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
803
804   /* Additional ISDB-T properties */
805
806   /* Valid values are 0x1 0x2 0x4 |-ables */
807   g_object_class_install_property (gobject_class,
808       ARG_DVBSRC_ISDBT_LAYER_ENABLED,
809       g_param_spec_uint ("isdbt-layer-enabled",
810           "ISDB-T layer enabled",
811           "(ISDB-T) Layer Enabled (7 = All layers)", 1, 7,
812           DEFAULT_ISDBT_LAYER_ENABLED,
813           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
814
815   g_object_class_install_property (gobject_class,
816       ARG_DVBSRC_ISDBT_PARTIAL_RECEPTION,
817       g_param_spec_int ("isdbt-partial-reception",
818           "ISDB-T partial reception",
819           "(ISDB-T) Partial Reception (-1 = AUTO)", -1, 1,
820           DEFAULT_ISDBT_PARTIAL_RECEPTION,
821           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
822
823   g_object_class_install_property (gobject_class,
824       ARG_DVBSRC_ISDBT_SOUND_BROADCASTING,
825       g_param_spec_int ("isdbt-sound-broadcasting",
826           "ISDB-T sound broadcasting",
827           "(ISDB-T) Sound Broadcasting", 0, 1,
828           DEFAULT_ISDBT_SOUND_BROADCASTING,
829           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
830
831   g_object_class_install_property (gobject_class,
832       ARG_DVBSRC_ISDBT_SB_SUBCHANNEL_ID,
833       g_param_spec_int ("isdbt-sb-subchannel-id",
834           "ISDB-T SB subchannel ID",
835           "(ISDB-T) SB Subchannel ID (-1 = AUTO)", -1, 41,
836           DEFAULT_ISDBT_SB_SEGMENT_IDX,
837           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
838
839   g_object_class_install_property (gobject_class,
840       ARG_DVBSRC_ISDBT_SB_SEGMENT_IDX,
841       g_param_spec_int ("isdbt-sb-segment-idx",
842           "ISDB-T SB segment IDX",
843           "(ISDB-T) SB segment IDX", 0, 12,
844           DEFAULT_ISDBT_SB_SEGMENT_IDX,
845           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
846
847   g_object_class_install_property (gobject_class,
848       ARG_DVBSRC_ISDBT_SB_SEGMENT_COUNT,
849       g_param_spec_uint ("isdbt-sb-segment-count",
850           "ISDB-T SB segment count",
851           "(ISDB-T) SB segment count", 1, 13,
852           DEFAULT_ISDBT_SB_SEGMENT_COUNT,
853           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
854
855   g_object_class_install_property (gobject_class, ARG_DVBSRC_ISDBT_LAYERA_FEC,
856       g_param_spec_enum ("isdbt-layera-fec",
857           "ISDB-T layer A FEC", "(ISDB-T) layer A Forward Error Correction",
858           GST_TYPE_DVBSRC_CODE_RATE, DEFAULT_ISDBT_LAYERA_FEC,
859           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
860
861   g_object_class_install_property (gobject_class, ARG_DVBSRC_ISDBT_LAYERB_FEC,
862       g_param_spec_enum ("isdbt-layerb-fec",
863           "ISDB-T layer B FEC", "(ISDB-T) layer B Forward Error Correction",
864           GST_TYPE_DVBSRC_CODE_RATE, DEFAULT_ISDBT_LAYERB_FEC,
865           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
866
867   g_object_class_install_property (gobject_class, ARG_DVBSRC_ISDBT_LAYERC_FEC,
868       g_param_spec_enum ("isdbt-layerc-fec",
869           "ISDB-T layer A FEC", "(ISDB-T) layer C Forward Error Correction",
870           GST_TYPE_DVBSRC_CODE_RATE, DEFAULT_ISDBT_LAYERC_FEC,
871           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
872
873   g_object_class_install_property (gobject_class,
874       ARG_DVBSRC_ISDBT_LAYERA_MODULATION,
875       g_param_spec_enum ("isdbt-layera-modulation", "ISDBT layer A modulation",
876           "(ISDB-T) Layer A modulation type",
877           GST_TYPE_DVBSRC_MODULATION, DEFAULT_ISDBT_LAYERA_MODULATION,
878           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
879
880   g_object_class_install_property (gobject_class,
881       ARG_DVBSRC_ISDBT_LAYERB_MODULATION,
882       g_param_spec_enum ("isdbt-layerb-modulation", "ISDBT layer B modulation",
883           "(ISDB-T) Layer B modulation type",
884           GST_TYPE_DVBSRC_MODULATION, DEFAULT_ISDBT_LAYERB_MODULATION,
885           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
886
887   g_object_class_install_property (gobject_class,
888       ARG_DVBSRC_ISDBT_LAYERC_MODULATION,
889       g_param_spec_enum ("isdbt-layerc-modulation", "ISDBT layer C modulation",
890           "(ISDB-T) Layer C modulation type",
891           GST_TYPE_DVBSRC_MODULATION, DEFAULT_ISDBT_LAYERC_MODULATION,
892           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
893
894   g_object_class_install_property (gobject_class,
895       ARG_DVBSRC_ISDBT_LAYERA_SEGMENT_COUNT,
896       g_param_spec_int ("isdbt-layera-segment-count",
897           "ISDB-T layer A segment count",
898           "(ISDB-T) Layer A segment count (-1 = AUTO)", -1, 13,
899           DEFAULT_ISDBT_LAYERA_SEGMENT_COUNT,
900           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
901
902   g_object_class_install_property (gobject_class,
903       ARG_DVBSRC_ISDBT_LAYERB_SEGMENT_COUNT,
904       g_param_spec_int ("isdbt-layerb-segment-count",
905           "ISDB-T layer B segment count",
906           "(ISDB-T) Layer B segment count (-1 = AUTO)", -1, 13,
907           DEFAULT_ISDBT_LAYERB_SEGMENT_COUNT,
908           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
909
910   g_object_class_install_property (gobject_class,
911       ARG_DVBSRC_ISDBT_LAYERC_SEGMENT_COUNT,
912       g_param_spec_int ("isdbt-layerc-segment-count",
913           "ISDB-T layer C segment count",
914           "(ISDB-T) Layer C segment count (-1 = AUTO)", -1, 13,
915           DEFAULT_ISDBT_LAYERC_SEGMENT_COUNT,
916           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
917
918   g_object_class_install_property (gobject_class,
919       ARG_DVBSRC_ISDBT_LAYERA_TIME_INTERLEAVING,
920       g_param_spec_int ("isdbt-layera-time-interleaving",
921           "ISDB-T layer A time interleaving",
922           "(ISDB-T) Layer A time interleaving (-1 = AUTO)", -1, 8,
923           DEFAULT_ISDBT_LAYERA_TIME_INTERLEAVING,
924           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
925
926   g_object_class_install_property (gobject_class,
927       ARG_DVBSRC_ISDBT_LAYERB_TIME_INTERLEAVING,
928       g_param_spec_int ("isdbt-layerb-time-interleaving",
929           "ISDB-T layer B time interleaving",
930           "(ISDB-T) Layer B time interleaving (-1 = AUTO)", -1, 8,
931           DEFAULT_ISDBT_LAYERB_TIME_INTERLEAVING,
932           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
933
934   g_object_class_install_property (gobject_class,
935       ARG_DVBSRC_ISDBT_LAYERC_TIME_INTERLEAVING,
936       g_param_spec_int ("isdbt-layerc-time-interleaving",
937           "ISDB-T layer C time interleaving",
938           "(ISDB-T) Layer C time interleaving (-1 = AUTO)", -1, 8,
939           DEFAULT_ISDBT_LAYERC_TIME_INTERLEAVING,
940           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
941
942   /* LNB properties (Satellite distribution standards) */
943
944   g_object_class_install_property (gobject_class, ARG_DVBSRC_LNB_SLOF,
945       g_param_spec_uint ("lnb-slof", "Tuning Timeout",
946           "LNB's Upper bound for low band reception (kHz)",
947           0, G_MAXUINT, DEFAULT_LNB_SLOF,
948           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
949
950   g_object_class_install_property (gobject_class, ARG_DVBSRC_LNB_LOF1,
951       g_param_spec_uint ("lnb-lof1", "Low band local oscillator frequency",
952           "LNB's Local oscillator frequency used for low band reception (kHz)",
953           0, G_MAXUINT, DEFAULT_LNB_LOF1,
954           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
955
956   g_object_class_install_property (gobject_class, ARG_DVBSRC_LNB_LOF2,
957       g_param_spec_uint ("lnb-lof2", "High band local oscillator frequency",
958           "LNB's Local oscillator frequency used for high band reception (kHz)",
959           0, G_MAXUINT, DEFAULT_LNB_LOF2,
960           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
961
962   /* Additional DTMB properties */
963
964   g_object_class_install_property (gobject_class,
965       ARG_DVBSRC_INTERLEAVING,
966       g_param_spec_enum ("interleaving", "DTMB Interleaving",
967           "(DTMB) Interleaving type",
968           GST_TYPE_INTERLEAVING, DEFAULT_INTERLEAVING,
969           GST_PARAM_MUTABLE_PLAYING | G_PARAM_READWRITE));
970
971   /**
972    * GstDvbSrc::tuning-start:
973    * @gstdvbsrc: the element on which the signal is emitted
974    *
975    * Signal emited when the element first attempts to tune the
976    * frontend tunner to a given frequency.
977    */
978   gst_dvbsrc_signals[SIGNAL_TUNING_START] =
979       g_signal_new ("tuning-start", G_TYPE_FROM_CLASS (klass),
980       G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0);
981   /**
982    * GstDvbSrc::tuning-done:
983    * @gstdvbsrc: the element on which the signal is emitted
984    *
985    * Signal emited when the tunner has successfully got a lock on a signal.
986    */
987   gst_dvbsrc_signals[SIGNAL_TUNING_DONE] =
988       g_signal_new ("tuning-done", G_TYPE_FROM_CLASS (klass),
989       G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0);
990   /**
991    * GstDvbSrc::tuning-fail:
992    * @gstdvbsrc: the element on which the signal is emitted
993    *
994    * Signal emited when the tunner failed to get a lock on the
995    * signal.
996    */
997   gst_dvbsrc_signals[SIGNAL_TUNING_FAIL] =
998       g_signal_new ("tuning-fail", G_TYPE_FROM_CLASS (klass),
999       G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL, G_TYPE_NONE, 0);
1000
1001   /**
1002    * GstDvbSrc::tune:
1003    * @gstdvbsrc: the element on which the signal is emitted
1004    *
1005    * Signal emited from the application to the element, instructing it
1006    * to tune.
1007    */
1008   gst_dvbsrc_signals[SIGNAL_TUNE] =
1009       g_signal_new ("tune", G_TYPE_FROM_CLASS (klass),
1010       G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
1011       G_STRUCT_OFFSET (GstDvbSrcClass, do_tune),
1012       NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
1013
1014 }
1015
1016 /* initialize the new element
1017  * instantiate pads and add them to element
1018  * set functions
1019  * initialize structure
1020  */
1021 static void
1022 gst_dvbsrc_init (GstDvbSrc * object)
1023 {
1024   int i = 0;
1025   const gchar *adapter;
1026
1027   GST_DEBUG_OBJECT (object, "Kernel DVB API version %d.%d", DVB_API_VERSION,
1028       DVB_API_VERSION_MINOR);
1029
1030   /* We are a live source */
1031   gst_base_src_set_live (GST_BASE_SRC (object), TRUE);
1032   /* And we wanted timestamped output */
1033   gst_base_src_set_do_timestamp (GST_BASE_SRC (object), TRUE);
1034   gst_base_src_set_format (GST_BASE_SRC (object), GST_FORMAT_TIME);
1035
1036   object->fd_frontend = -1;
1037   object->fd_dvr = -1;
1038   object->supported_delsys = NULL;
1039
1040   for (i = 0; i < MAX_FILTERS; i++) {
1041     object->fd_filters[i] = -1;
1042   }
1043
1044   /* PID 8192 on DVB gets the whole transport stream */
1045   object->pids[0] = 8192;
1046   object->pids[1] = G_MAXUINT16;
1047   object->dvb_buffer_size = DEFAULT_DVB_BUFFER_SIZE;
1048
1049   adapter = g_getenv ("GST_DVB_ADAPTER");
1050   if (adapter)
1051     object->adapter_number = atoi (adapter);
1052   else
1053     object->adapter_number = DEFAULT_ADAPTER;
1054
1055   object->frontend_number = DEFAULT_FRONTEND;
1056   object->diseqc_src = DEFAULT_DISEQC_SRC;
1057   object->send_diseqc = (DEFAULT_DISEQC_SRC != -1);
1058   object->tone = SEC_TONE_OFF;
1059   /* object->pol = DVB_POL_H; *//* set via G_PARAM_CONSTRUCT */
1060   object->sym_rate = DEFAULT_SYMBOL_RATE;
1061   object->bandwidth = DEFAULT_BANDWIDTH;
1062   object->code_rate_hp = DEFAULT_CODE_RATE_HP;
1063   object->code_rate_lp = DEFAULT_CODE_RATE_LP;
1064   object->guard_interval = DEFAULT_GUARD;
1065   object->modulation = DEFAULT_MODULATION;
1066   object->transmission_mode = DEFAULT_TRANSMISSION_MODE;
1067   object->hierarchy_information = DEFAULT_HIERARCHY;
1068   object->inversion = DEFAULT_INVERSION;
1069   object->stats_interval = DEFAULT_STATS_REPORTING_INTERVAL;
1070   object->delsys = DEFAULT_DELSYS;
1071   object->pilot = DEFAULT_PILOT;
1072   object->rolloff = DEFAULT_ROLLOFF;
1073   object->stream_id = DEFAULT_STREAM_ID;
1074
1075   object->isdbt_layer_enabled = DEFAULT_ISDBT_LAYER_ENABLED;
1076   object->isdbt_partial_reception = DEFAULT_ISDBT_PARTIAL_RECEPTION;
1077   object->isdbt_sound_broadcasting = DEFAULT_ISDBT_SOUND_BROADCASTING;
1078   object->isdbt_sb_subchannel_id = DEFAULT_ISDBT_SB_SUBCHANNEL_ID;
1079   object->isdbt_sb_segment_idx = DEFAULT_ISDBT_SB_SEGMENT_IDX;
1080   object->isdbt_sb_segment_count = DEFAULT_ISDBT_SB_SEGMENT_COUNT;
1081   object->isdbt_layera_fec = DEFAULT_ISDBT_LAYERA_FEC;
1082   object->isdbt_layera_modulation = DEFAULT_ISDBT_LAYERA_MODULATION;
1083   object->isdbt_layera_segment_count = DEFAULT_ISDBT_LAYERA_SEGMENT_COUNT;
1084   object->isdbt_layera_time_interleaving =
1085       DEFAULT_ISDBT_LAYERA_TIME_INTERLEAVING;
1086   object->isdbt_layerb_fec = DEFAULT_ISDBT_LAYERB_FEC;
1087   object->isdbt_layerb_modulation = DEFAULT_ISDBT_LAYERB_MODULATION;
1088   object->isdbt_layerb_segment_count = DEFAULT_ISDBT_LAYERB_SEGMENT_COUNT;
1089   object->isdbt_layerb_time_interleaving =
1090       DEFAULT_ISDBT_LAYERB_TIME_INTERLEAVING;
1091   object->isdbt_layerc_fec = DEFAULT_ISDBT_LAYERC_FEC;
1092   object->isdbt_layerc_modulation = DEFAULT_ISDBT_LAYERC_MODULATION;
1093   object->isdbt_layerc_segment_count = DEFAULT_ISDBT_LAYERC_SEGMENT_COUNT;
1094   object->isdbt_layerc_time_interleaving =
1095       DEFAULT_ISDBT_LAYERC_TIME_INTERLEAVING;
1096
1097   object->lnb_slof = DEFAULT_LNB_SLOF;
1098   object->lnb_lof1 = DEFAULT_LNB_LOF1;
1099   object->lnb_lof2 = DEFAULT_LNB_LOF2;
1100
1101   object->interleaving = DEFAULT_INTERLEAVING;
1102
1103   g_mutex_init (&object->tune_mutex);
1104   object->timeout = DEFAULT_TIMEOUT;
1105   object->tuning_timeout = DEFAULT_TUNING_TIMEOUT;
1106 }
1107
1108 static void
1109 gst_dvbsrc_set_pids (GstDvbSrc * dvbsrc, const gchar * pid_string)
1110 {
1111   int pid = 0;
1112   int pid_count;
1113   gchar **pids;
1114   char **tmp;
1115
1116   if (!strcmp (pid_string, "8192")) {
1117     /* get the whole TS */
1118     dvbsrc->pids[0] = 8192;
1119     dvbsrc->pids[1] = G_MAXUINT16;
1120     goto done;
1121   }
1122
1123   /* always add the PAT and CAT pids */
1124   dvbsrc->pids[0] = 0;
1125   dvbsrc->pids[1] = 1;
1126   pid_count = 2;
1127
1128   tmp = pids = g_strsplit (pid_string, ":", MAX_FILTERS);
1129
1130   while (*pids != NULL && pid_count < MAX_FILTERS) {
1131     pid = strtol (*pids, NULL, 0);
1132     if (pid > 1 && pid <= 8192) {
1133       GST_INFO_OBJECT (dvbsrc, "Parsed PID: %d", pid);
1134       dvbsrc->pids[pid_count] = pid;
1135       pid_count++;
1136     }
1137     pids++;
1138   }
1139
1140   g_strfreev (tmp);
1141
1142   if (pid_count < MAX_FILTERS)
1143     dvbsrc->pids[pid_count] = G_MAXUINT16;
1144
1145 done:
1146   if (GST_ELEMENT (dvbsrc)->current_state > GST_STATE_READY) {
1147     GST_INFO_OBJECT (dvbsrc, "Setting PES filters now");
1148     gst_dvbsrc_set_pes_filters (dvbsrc);
1149   } else
1150     GST_INFO_OBJECT (dvbsrc, "Not setting PES filters because state < PAUSED");
1151 }
1152
1153 static void
1154 gst_dvbsrc_set_property (GObject * _object, guint prop_id,
1155     const GValue * value, GParamSpec * pspec)
1156 {
1157   GstDvbSrc *object;
1158
1159   g_return_if_fail (GST_IS_DVBSRC (_object));
1160   object = GST_DVBSRC (_object);
1161
1162   switch (prop_id) {
1163     case ARG_DVBSRC_ADAPTER:
1164       object->adapter_number = g_value_get_int (value);
1165       break;
1166     case ARG_DVBSRC_FRONTEND:
1167       object->frontend_number = g_value_get_int (value);
1168       break;
1169     case ARG_DVBSRC_DISEQC_SRC:
1170       if (object->diseqc_src != g_value_get_int (value)) {
1171         object->diseqc_src = g_value_get_int (value);
1172         object->send_diseqc = TRUE;
1173       }
1174       GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_DISEQC_ID");
1175       break;
1176     case ARG_DVBSRC_FREQUENCY:
1177       object->freq = g_value_get_uint (value);
1178       GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_FREQUENCY (%d Hz)",
1179           object->freq);
1180       break;
1181     case ARG_DVBSRC_POLARITY:
1182     {
1183       const char *s = NULL;
1184
1185       s = g_value_get_string (value);
1186       if (s != NULL) {
1187         object->pol = (s[0] == 'h' || s[0] == 'H') ? DVB_POL_H : DVB_POL_V;
1188         GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_POLARITY to %s",
1189             object->pol ? "Vertical" : "Horizontal");
1190       }
1191       break;
1192     }
1193     case ARG_DVBSRC_PIDS:
1194     {
1195       const gchar *pid_string;
1196
1197       pid_string = g_value_get_string (value);
1198       GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_PIDS %s", pid_string);
1199       if (pid_string)
1200         gst_dvbsrc_set_pids (object, pid_string);
1201       break;
1202     }
1203     case ARG_DVBSRC_SYM_RATE:
1204       object->sym_rate = g_value_get_uint (value);
1205       GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_SYM_RATE to value %d",
1206           object->sym_rate);
1207       break;
1208
1209     case ARG_DVBSRC_BANDWIDTH_HZ:
1210       object->bandwidth = g_value_get_uint (value);
1211       break;
1212     case ARG_DVBSRC_BANDWIDTH:
1213       switch (g_value_get_enum (value)) {
1214         case BANDWIDTH_8_MHZ:
1215           object->bandwidth = 8000000;
1216           break;
1217         case BANDWIDTH_7_MHZ:
1218           object->bandwidth = 7000000;
1219           break;
1220         case BANDWIDTH_6_MHZ:
1221           object->bandwidth = 6000000;
1222           break;
1223         case BANDWIDTH_5_MHZ:
1224           object->bandwidth = 5000000;
1225           break;
1226         case BANDWIDTH_10_MHZ:
1227           object->bandwidth = 10000000;
1228           break;
1229         case BANDWIDTH_1_712_MHZ:
1230           object->bandwidth = 1712000;
1231           break;
1232         default:
1233           /* we don't know which bandwidth is set */
1234           object->bandwidth = 0;
1235           break;
1236       }
1237       break;
1238     case ARG_DVBSRC_CODE_RATE_HP:
1239       object->code_rate_hp = g_value_get_enum (value);
1240       break;
1241     case ARG_DVBSRC_CODE_RATE_LP:
1242       object->code_rate_lp = g_value_get_enum (value);
1243       break;
1244     case ARG_DVBSRC_GUARD:
1245       object->guard_interval = g_value_get_enum (value);
1246       break;
1247     case ARG_DVBSRC_MODULATION:
1248       object->modulation = g_value_get_enum (value);
1249       break;
1250     case ARG_DVBSRC_TRANSMISSION_MODE:
1251       object->transmission_mode = g_value_get_enum (value);
1252       break;
1253     case ARG_DVBSRC_HIERARCHY_INF:
1254       object->hierarchy_information = g_value_get_enum (value);
1255       break;
1256     case ARG_DVBSRC_INVERSION:
1257       object->inversion = g_value_get_enum (value);
1258       break;
1259     case ARG_DVBSRC_TUNE:
1260       GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_TUNE");
1261       gst_dvbsrc_do_tune (object);
1262       break;
1263     case ARG_DVBSRC_STATS_REPORTING_INTERVAL:
1264       object->stats_interval = g_value_get_uint (value);
1265       object->stats_counter = 0;
1266       break;
1267     case ARG_DVBSRC_TIMEOUT:
1268       object->timeout = g_value_get_uint64 (value);
1269       break;
1270     case ARG_DVBSRC_TUNING_TIMEOUT:
1271       object->tuning_timeout = g_value_get_uint64 (value);
1272       break;
1273     case ARG_DVBSRC_DVB_BUFFER_SIZE:
1274       object->dvb_buffer_size = g_value_get_uint (value);
1275       break;
1276     case ARG_DVBSRC_DELSYS:
1277       object->delsys = g_value_get_enum (value);
1278       break;
1279     case ARG_DVBSRC_PILOT:
1280       object->pilot = g_value_get_enum (value);
1281       break;
1282     case ARG_DVBSRC_ROLLOFF:
1283       object->rolloff = g_value_get_enum (value);
1284       break;
1285     case ARG_DVBSRC_STREAM_ID:
1286       object->stream_id = g_value_get_int (value);
1287       break;
1288     case ARG_DVBSRC_ISDBT_LAYER_ENABLED:
1289       object->isdbt_layer_enabled = g_value_get_uint (value);
1290       break;
1291     case ARG_DVBSRC_ISDBT_PARTIAL_RECEPTION:
1292       object->isdbt_partial_reception = g_value_get_int (value);
1293       break;
1294     case ARG_DVBSRC_ISDBT_SOUND_BROADCASTING:
1295       object->isdbt_sound_broadcasting = g_value_get_int (value);
1296       break;
1297     case ARG_DVBSRC_ISDBT_SB_SUBCHANNEL_ID:
1298       object->isdbt_sb_subchannel_id = g_value_get_int (value);
1299       break;
1300     case ARG_DVBSRC_ISDBT_SB_SEGMENT_IDX:
1301       object->isdbt_sb_segment_idx = g_value_get_int (value);
1302       break;
1303     case ARG_DVBSRC_ISDBT_SB_SEGMENT_COUNT:
1304       object->isdbt_sb_segment_count = g_value_get_uint (value);
1305       break;
1306     case ARG_DVBSRC_ISDBT_LAYERA_FEC:
1307       object->isdbt_layera_fec = g_value_get_enum (value);
1308       break;
1309     case ARG_DVBSRC_ISDBT_LAYERA_MODULATION:
1310       object->isdbt_layera_modulation = g_value_get_enum (value);
1311       break;
1312     case ARG_DVBSRC_ISDBT_LAYERA_SEGMENT_COUNT:
1313       object->isdbt_layera_segment_count = g_value_get_int (value);
1314       break;
1315     case ARG_DVBSRC_ISDBT_LAYERA_TIME_INTERLEAVING:
1316       object->isdbt_layera_time_interleaving = g_value_get_int (value);
1317       break;
1318     case ARG_DVBSRC_ISDBT_LAYERB_FEC:
1319       object->isdbt_layerb_fec = g_value_get_enum (value);
1320       break;
1321     case ARG_DVBSRC_ISDBT_LAYERB_MODULATION:
1322       object->isdbt_layerb_modulation = g_value_get_enum (value);
1323       break;
1324     case ARG_DVBSRC_ISDBT_LAYERB_SEGMENT_COUNT:
1325       object->isdbt_layerb_segment_count = g_value_get_int (value);
1326       break;
1327     case ARG_DVBSRC_ISDBT_LAYERB_TIME_INTERLEAVING:
1328       object->isdbt_layerb_time_interleaving = g_value_get_int (value);
1329       break;
1330     case ARG_DVBSRC_ISDBT_LAYERC_FEC:
1331       object->isdbt_layerc_fec = g_value_get_enum (value);
1332       break;
1333     case ARG_DVBSRC_ISDBT_LAYERC_MODULATION:
1334       object->isdbt_layerc_modulation = g_value_get_enum (value);
1335       break;
1336     case ARG_DVBSRC_ISDBT_LAYERC_SEGMENT_COUNT:
1337       object->isdbt_layerc_segment_count = g_value_get_int (value);
1338       break;
1339     case ARG_DVBSRC_ISDBT_LAYERC_TIME_INTERLEAVING:
1340       object->isdbt_layerc_time_interleaving = g_value_get_int (value);
1341       break;
1342     case ARG_DVBSRC_LNB_SLOF:
1343       object->lnb_slof = g_value_get_uint (value);
1344       break;
1345     case ARG_DVBSRC_LNB_LOF1:
1346       object->lnb_lof1 = g_value_get_uint (value);
1347       break;
1348     case ARG_DVBSRC_LNB_LOF2:
1349       object->lnb_lof2 = g_value_get_uint (value);
1350       break;
1351     case ARG_DVBSRC_INTERLEAVING:
1352       object->interleaving = g_value_get_enum (value);
1353       break;
1354     default:
1355       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1356   }
1357 }
1358
1359 static void
1360 gst_dvbsrc_get_property (GObject * _object, guint prop_id,
1361     GValue * value, GParamSpec * pspec)
1362 {
1363   GstDvbSrc *object;
1364
1365   g_return_if_fail (GST_IS_DVBSRC (_object));
1366   object = GST_DVBSRC (_object);
1367
1368   switch (prop_id) {
1369     case ARG_DVBSRC_ADAPTER:
1370       g_value_set_int (value, object->adapter_number);
1371       break;
1372     case ARG_DVBSRC_FRONTEND:
1373       g_value_set_int (value, object->frontend_number);
1374       break;
1375     case ARG_DVBSRC_FREQUENCY:
1376       g_value_set_uint (value, object->freq);
1377       break;
1378     case ARG_DVBSRC_POLARITY:
1379       if (object->pol == DVB_POL_H)
1380         g_value_set_static_string (value, "H");
1381       else
1382         g_value_set_static_string (value, "V");
1383       break;
1384     case ARG_DVBSRC_SYM_RATE:
1385       g_value_set_uint (value, object->sym_rate);
1386       break;
1387     case ARG_DVBSRC_DISEQC_SRC:
1388       g_value_set_int (value, object->diseqc_src);
1389       break;
1390     case ARG_DVBSRC_BANDWIDTH_HZ:
1391       g_value_set_uint (value, object->bandwidth);
1392       break;
1393     case ARG_DVBSRC_BANDWIDTH:{
1394       int tmp;
1395       if (!object->bandwidth)
1396         tmp = BANDWIDTH_AUTO;
1397       else if (object->bandwidth <= 1712000)
1398         tmp = BANDWIDTH_1_712_MHZ;
1399       else if (object->bandwidth <= 5000000)
1400         tmp = BANDWIDTH_5_MHZ;
1401       else if (object->bandwidth <= 6000000)
1402         tmp = BANDWIDTH_6_MHZ;
1403       else if (object->bandwidth <= 7000000)
1404         tmp = BANDWIDTH_7_MHZ;
1405       else if (object->bandwidth <= 8000000)
1406         tmp = BANDWIDTH_8_MHZ;
1407       else if (object->bandwidth <= 10000000)
1408         tmp = BANDWIDTH_10_MHZ;
1409       else
1410         tmp = BANDWIDTH_AUTO;
1411
1412       g_value_set_enum (value, tmp);
1413       break;
1414     }
1415     case ARG_DVBSRC_CODE_RATE_HP:
1416       g_value_set_enum (value, object->code_rate_hp);
1417       break;
1418     case ARG_DVBSRC_CODE_RATE_LP:
1419       g_value_set_enum (value, object->code_rate_lp);
1420       break;
1421     case ARG_DVBSRC_GUARD:
1422       g_value_set_enum (value, object->guard_interval);
1423       break;
1424     case ARG_DVBSRC_MODULATION:
1425       g_value_set_enum (value, object->modulation);
1426       break;
1427     case ARG_DVBSRC_TRANSMISSION_MODE:
1428       g_value_set_enum (value, object->transmission_mode);
1429       break;
1430     case ARG_DVBSRC_HIERARCHY_INF:
1431       g_value_set_enum (value, object->hierarchy_information);
1432       break;
1433     case ARG_DVBSRC_INVERSION:
1434       g_value_set_enum (value, object->inversion);
1435       break;
1436     case ARG_DVBSRC_STATS_REPORTING_INTERVAL:
1437       g_value_set_uint (value, object->stats_interval);
1438       break;
1439     case ARG_DVBSRC_TIMEOUT:
1440       g_value_set_uint64 (value, object->timeout);
1441       break;
1442     case ARG_DVBSRC_TUNING_TIMEOUT:
1443       g_value_set_uint64 (value, object->tuning_timeout);
1444       break;
1445     case ARG_DVBSRC_DVB_BUFFER_SIZE:
1446       g_value_set_uint (value, object->dvb_buffer_size);
1447       break;
1448     case ARG_DVBSRC_DELSYS:
1449       g_value_set_enum (value, object->delsys);
1450       break;
1451     case ARG_DVBSRC_PILOT:
1452       g_value_set_enum (value, object->pilot);
1453       break;
1454     case ARG_DVBSRC_ROLLOFF:
1455       g_value_set_enum (value, object->rolloff);
1456       break;
1457     case ARG_DVBSRC_STREAM_ID:
1458       g_value_set_int (value, object->stream_id);
1459       break;
1460     case ARG_DVBSRC_ISDBT_LAYER_ENABLED:
1461       g_value_set_uint (value, object->isdbt_layer_enabled);
1462       break;
1463     case ARG_DVBSRC_ISDBT_PARTIAL_RECEPTION:
1464       g_value_set_int (value, object->isdbt_partial_reception);
1465       break;
1466     case ARG_DVBSRC_ISDBT_SOUND_BROADCASTING:
1467       g_value_set_int (value, object->isdbt_sound_broadcasting);
1468       break;
1469     case ARG_DVBSRC_ISDBT_SB_SUBCHANNEL_ID:
1470       g_value_set_int (value, object->isdbt_sb_subchannel_id);
1471       break;
1472     case ARG_DVBSRC_ISDBT_SB_SEGMENT_IDX:
1473       g_value_set_int (value, object->isdbt_sb_segment_idx);
1474       break;
1475     case ARG_DVBSRC_ISDBT_SB_SEGMENT_COUNT:
1476       g_value_set_uint (value, object->isdbt_sb_segment_count);
1477       break;
1478     case ARG_DVBSRC_ISDBT_LAYERA_FEC:
1479       g_value_set_enum (value, object->isdbt_layera_fec);
1480       break;
1481     case ARG_DVBSRC_ISDBT_LAYERA_MODULATION:
1482       g_value_set_enum (value, object->isdbt_layera_modulation);
1483       break;
1484     case ARG_DVBSRC_ISDBT_LAYERA_SEGMENT_COUNT:
1485       g_value_set_int (value, object->isdbt_layera_segment_count);
1486       break;
1487     case ARG_DVBSRC_ISDBT_LAYERA_TIME_INTERLEAVING:
1488       g_value_set_int (value, object->isdbt_layera_time_interleaving);
1489       break;
1490     case ARG_DVBSRC_ISDBT_LAYERB_FEC:
1491       g_value_set_enum (value, object->isdbt_layerb_fec);
1492       break;
1493     case ARG_DVBSRC_ISDBT_LAYERB_MODULATION:
1494       g_value_set_enum (value, object->isdbt_layerb_modulation);
1495       break;
1496     case ARG_DVBSRC_ISDBT_LAYERB_SEGMENT_COUNT:
1497       g_value_set_int (value, object->isdbt_layerb_segment_count);
1498       break;
1499     case ARG_DVBSRC_ISDBT_LAYERB_TIME_INTERLEAVING:
1500       g_value_set_int (value, object->isdbt_layerb_time_interleaving);
1501       break;
1502     case ARG_DVBSRC_ISDBT_LAYERC_FEC:
1503       g_value_set_enum (value, object->isdbt_layerc_fec);
1504       break;
1505     case ARG_DVBSRC_ISDBT_LAYERC_MODULATION:
1506       g_value_set_enum (value, object->isdbt_layerc_modulation);
1507       break;
1508     case ARG_DVBSRC_ISDBT_LAYERC_SEGMENT_COUNT:
1509       g_value_set_int (value, object->isdbt_layerc_segment_count);
1510       break;
1511     case ARG_DVBSRC_ISDBT_LAYERC_TIME_INTERLEAVING:
1512       g_value_set_int (value, object->isdbt_layerc_time_interleaving);
1513       break;
1514     case ARG_DVBSRC_LNB_SLOF:
1515       g_value_set_uint (value, object->lnb_slof);
1516       break;
1517     case ARG_DVBSRC_LNB_LOF1:
1518       g_value_set_uint (value, object->lnb_lof1);
1519       break;
1520     case ARG_DVBSRC_LNB_LOF2:
1521       g_value_set_uint (value, object->lnb_lof2);
1522       break;
1523     case ARG_DVBSRC_INTERLEAVING:
1524       g_value_set_enum (value, object->interleaving);
1525       break;
1526     default:
1527       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
1528   }
1529 }
1530
1531 static gboolean
1532 gst_dvbsrc_close_devices (GstDvbSrc * object)
1533 {
1534   gst_dvbsrc_unset_pes_filters (object);
1535
1536   close (object->fd_dvr);
1537   object->fd_dvr = -1;
1538   close (object->fd_frontend);
1539   object->fd_frontend = -1;
1540
1541   return TRUE;
1542 }
1543
1544 static gboolean
1545 gst_dvbsrc_check_delsys (struct dtv_property *prop, guchar delsys)
1546 {
1547   int i;
1548
1549   for (i = 0; i < prop->u.buffer.len; i++) {
1550     if (prop->u.buffer.data[i] == delsys)
1551       return TRUE;
1552   }
1553   GST_LOG ("Adapter does not support delsys: %d", delsys);
1554   return FALSE;
1555 }
1556
1557 static gboolean
1558 gst_dvbsrc_open_frontend (GstDvbSrc * object, gboolean writable)
1559 {
1560   struct dvb_frontend_info fe_info;
1561   struct dtv_properties props;
1562   struct dtv_property dvb_prop[1];
1563   gchar *frontend_dev;
1564   GstStructure *adapter_structure;
1565   char *adapter_name = NULL;
1566   gint err;
1567
1568   frontend_dev = g_strdup_printf ("/dev/dvb/adapter%d/frontend%d",
1569       object->adapter_number, object->frontend_number);
1570   GST_INFO_OBJECT (object, "Using frontend device: %s", frontend_dev);
1571
1572   /* open frontend */
1573   LOOP_WHILE_EINTR (object->fd_frontend,
1574       open (frontend_dev, writable ? O_RDWR : O_RDONLY));
1575   if (object->fd_frontend < 0) {
1576     switch (errno) {
1577       case ENOENT:
1578         GST_ELEMENT_ERROR (object, RESOURCE, NOT_FOUND,
1579             (_("Device \"%s\" does not exist."), frontend_dev), (NULL));
1580         break;
1581       default:
1582         GST_ELEMENT_ERROR (object, RESOURCE, OPEN_READ_WRITE,
1583             (_("Could not open frontend device \"%s\"."), frontend_dev),
1584             GST_ERROR_SYSTEM);
1585         break;
1586     }
1587
1588     g_free (frontend_dev);
1589     return FALSE;
1590   }
1591
1592   if (object->supported_delsys)
1593     goto delsys_detection_done;
1594
1595   /* Perform delivery system autodetection */
1596
1597   GST_DEBUG_OBJECT (object, "Device opened, querying information");
1598
1599   LOOP_WHILE_EINTR (err, ioctl (object->fd_frontend, FE_GET_INFO, &fe_info));
1600   if (err) {
1601     GST_ELEMENT_ERROR (object, RESOURCE, SETTINGS,
1602         (_("Could not get settings from frontend device \"%s\"."),
1603             frontend_dev), GST_ERROR_SYSTEM);
1604
1605     close (object->fd_frontend);
1606     g_free (frontend_dev);
1607     return FALSE;
1608   }
1609
1610   GST_DEBUG_OBJECT (object, "Get list of supported delivery systems");
1611
1612   dvb_prop[0].cmd = DTV_ENUM_DELSYS;
1613   props.num = 1;
1614   props.props = dvb_prop;
1615
1616   LOOP_WHILE_EINTR (err, ioctl (object->fd_frontend, FE_GET_PROPERTY, &props));
1617   if (err) {
1618     GST_ELEMENT_ERROR (object, RESOURCE, SETTINGS,
1619         (_("Cannot enumerate delivery systems from frontend device \"%s\"."),
1620             frontend_dev), GST_ERROR_SYSTEM);
1621
1622     close (object->fd_frontend);
1623     g_free (frontend_dev);
1624     return FALSE;
1625   }
1626
1627   GST_INFO_OBJECT (object, "Got information about adapter: %s", fe_info.name);
1628
1629   adapter_name = g_strdup (fe_info.name);
1630
1631   adapter_structure = gst_structure_new ("dvb-adapter",
1632       "name", G_TYPE_STRING, adapter_name,
1633       /* Capability supported auto params */
1634       "auto-inversion", G_TYPE_BOOLEAN, fe_info.caps & FE_CAN_INVERSION_AUTO,
1635       "auto-qam", G_TYPE_BOOLEAN, fe_info.caps & FE_CAN_QAM_AUTO,
1636       "auto-transmission-mode", G_TYPE_BOOLEAN,
1637       fe_info.caps & FE_CAN_TRANSMISSION_MODE_AUTO, "auto-guard-interval",
1638       G_TYPE_BOOLEAN, fe_info.caps & FE_CAN_GUARD_INTERVAL_AUTO,
1639       "auto-hierarchy", G_TYPE_BOOLEAN, fe_info.caps & FE_CAN_HIERARCHY_AUTO,
1640       "auto-fec", G_TYPE_BOOLEAN, fe_info.caps & FE_CAN_FEC_AUTO, NULL);
1641
1642   /* Capability delivery systems */
1643   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBC_ANNEX_A)) {
1644     object->supported_delsys = g_list_append (object->supported_delsys,
1645         GINT_TO_POINTER (SYS_DVBC_ANNEX_A));
1646     gst_structure_set (adapter_structure, "dvb-c-a", G_TYPE_STRING,
1647         "DVB-C ANNEX A", NULL);
1648   }
1649
1650   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBC_ANNEX_B)) {
1651     object->supported_delsys = g_list_append (object->supported_delsys,
1652         GINT_TO_POINTER (SYS_DVBC_ANNEX_B));
1653     gst_structure_set (adapter_structure, "dvb-c-b", G_TYPE_STRING,
1654         "DVB-C ANNEX B", NULL);
1655   }
1656
1657   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBT)) {
1658     object->supported_delsys = g_list_append (object->supported_delsys,
1659         GINT_TO_POINTER (SYS_DVBT));
1660     gst_structure_set (adapter_structure, "dvb-t", G_TYPE_STRING, "DVB-T",
1661         NULL);
1662   }
1663
1664   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DSS)) {
1665     object->supported_delsys = g_list_append (object->supported_delsys,
1666         GINT_TO_POINTER (SYS_DSS));
1667     gst_structure_set (adapter_structure, "dss", G_TYPE_STRING, "DSS", NULL);
1668   }
1669
1670   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBS)) {
1671     object->supported_delsys = g_list_append (object->supported_delsys,
1672         GINT_TO_POINTER (SYS_DVBS));
1673     gst_structure_set (adapter_structure, "dvb-s", G_TYPE_STRING, "DVB-S",
1674         NULL);
1675   }
1676
1677   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBS2)) {
1678     object->supported_delsys = g_list_append (object->supported_delsys,
1679         GINT_TO_POINTER (SYS_DVBS2));
1680     gst_structure_set (adapter_structure, "dvb-s2", G_TYPE_STRING, "DVB-S2",
1681         NULL);
1682   }
1683
1684   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBH)) {
1685     object->supported_delsys = g_list_append (object->supported_delsys,
1686         GINT_TO_POINTER (SYS_DVBH));
1687     gst_structure_set (adapter_structure, "dvb-h", G_TYPE_STRING, "DVB-H",
1688         NULL);
1689   }
1690
1691   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_ISDBT)) {
1692     object->supported_delsys = g_list_append (object->supported_delsys,
1693         GINT_TO_POINTER (SYS_ISDBT));
1694     gst_structure_set (adapter_structure, "isdb-t", G_TYPE_STRING, "ISDB-T",
1695         NULL);
1696   }
1697
1698   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_ISDBS)) {
1699     object->supported_delsys = g_list_append (object->supported_delsys,
1700         GINT_TO_POINTER (SYS_ISDBS));
1701     gst_structure_set (adapter_structure, "isdb-s", G_TYPE_STRING, "ISDB-S",
1702         NULL);
1703   }
1704
1705   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_ISDBC)) {
1706     object->supported_delsys = g_list_append (object->supported_delsys,
1707         GINT_TO_POINTER (SYS_ISDBC));
1708     gst_structure_set (adapter_structure, "isdb-c", G_TYPE_STRING, "ISDB-C",
1709         NULL);
1710   }
1711
1712   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_ATSC)) {
1713     object->supported_delsys = g_list_append (object->supported_delsys,
1714         GINT_TO_POINTER (SYS_ATSC));
1715     gst_structure_set (adapter_structure, "atsc", G_TYPE_STRING, "ATSC", NULL);
1716   }
1717
1718   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_ATSCMH)) {
1719     object->supported_delsys = g_list_append (object->supported_delsys,
1720         GINT_TO_POINTER (SYS_ATSCMH));
1721     gst_structure_set (adapter_structure, "atsc-mh", G_TYPE_STRING, "ATSC-MH",
1722         NULL);
1723   }
1724 #if HAVE_V5_MINOR(7)
1725   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DTMB)) {
1726     object->supported_delsys = g_list_append (object->supported_delsys,
1727         GINT_TO_POINTER (SYS_DTMB));
1728     gst_structure_set (adapter_structure, "dtmb", G_TYPE_STRING, "DTMB", NULL);
1729   }
1730 #endif
1731
1732   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_CMMB)) {
1733     object->supported_delsys = g_list_append (object->supported_delsys,
1734         GINT_TO_POINTER (SYS_CMMB));
1735     gst_structure_set (adapter_structure, "cmmb", G_TYPE_STRING, "CMMB", NULL);
1736   }
1737
1738   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DAB)) {
1739     object->supported_delsys = g_list_append (object->supported_delsys,
1740         GINT_TO_POINTER (SYS_DAB));
1741     gst_structure_set (adapter_structure, "dab", G_TYPE_STRING, "DAB", NULL);
1742   }
1743
1744   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBT2)) {
1745     object->supported_delsys = g_list_append (object->supported_delsys,
1746         GINT_TO_POINTER (SYS_DVBT2));
1747     gst_structure_set (adapter_structure, "dvb-t2", G_TYPE_STRING, "DVB-T2",
1748         NULL);
1749   }
1750
1751   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_TURBO)) {
1752     object->supported_delsys = g_list_append (object->supported_delsys,
1753         GINT_TO_POINTER (SYS_TURBO));
1754     gst_structure_set (adapter_structure, "turbo", G_TYPE_STRING, "TURBO",
1755         NULL);
1756   }
1757 #if HAVE_V5_MINOR(6)
1758   if (gst_dvbsrc_check_delsys (&dvb_prop[0], SYS_DVBC_ANNEX_C)) {
1759     object->supported_delsys = g_list_append (object->supported_delsys,
1760         GINT_TO_POINTER (SYS_DVBC_ANNEX_C));
1761     gst_structure_set (adapter_structure, "dvb-c-c", G_TYPE_STRING,
1762         "DVB-C ANNEX C", NULL);
1763   }
1764 #endif
1765
1766   GST_TRACE_OBJECT (object, "%s description: %" GST_PTR_FORMAT, adapter_name,
1767       adapter_structure);
1768   gst_element_post_message (GST_ELEMENT_CAST (object), gst_message_new_element
1769       (GST_OBJECT (object), adapter_structure));
1770   g_free (adapter_name);
1771
1772 delsys_detection_done:
1773   g_free (frontend_dev);
1774
1775   return TRUE;
1776 }
1777
1778 static gboolean
1779 gst_dvbsrc_open_dvr (GstDvbSrc * object)
1780 {
1781   gchar *dvr_dev;
1782   gint err;
1783
1784   dvr_dev = g_strdup_printf ("/dev/dvb/adapter%d/dvr%d",
1785       object->adapter_number, object->frontend_number);
1786   GST_INFO_OBJECT (object, "Using DVR device: %s", dvr_dev);
1787
1788   /* open DVR */
1789   if ((object->fd_dvr = open (dvr_dev, O_RDONLY | O_NONBLOCK)) < 0) {
1790     switch (errno) {
1791       case ENOENT:
1792         GST_ELEMENT_ERROR (object, RESOURCE, NOT_FOUND,
1793             (_("Device \"%s\" does not exist."), dvr_dev), (NULL));
1794         break;
1795       default:
1796         GST_ELEMENT_ERROR (object, RESOURCE, OPEN_READ,
1797             (_("Could not open file \"%s\" for reading."), dvr_dev),
1798             GST_ERROR_SYSTEM);
1799         break;
1800     }
1801     g_free (dvr_dev);
1802     return FALSE;
1803   }
1804   g_free (dvr_dev);
1805
1806   GST_INFO_OBJECT (object, "Setting DVB kernel buffer size to %d",
1807       object->dvb_buffer_size);
1808   LOOP_WHILE_EINTR (err, ioctl (object->fd_dvr, DMX_SET_BUFFER_SIZE,
1809           object->dvb_buffer_size));
1810   if (err) {
1811     GST_INFO_OBJECT (object, "ioctl DMX_SET_BUFFER_SIZE failed (%d)", errno);
1812     return FALSE;
1813   }
1814   return TRUE;
1815 }
1816
1817 static void
1818 gst_dvbsrc_finalize (GObject * _object)
1819 {
1820   GstDvbSrc *object;
1821
1822   GST_DEBUG_OBJECT (_object, "gst_dvbsrc_finalize");
1823
1824   g_return_if_fail (GST_IS_DVBSRC (_object));
1825   object = GST_DVBSRC (_object);
1826
1827   /* freeing the mutex segfaults somehow */
1828   g_mutex_clear (&object->tune_mutex);
1829
1830   if (G_OBJECT_CLASS (parent_class)->finalize)
1831     G_OBJECT_CLASS (parent_class)->finalize (_object);
1832 }
1833
1834
1835 /*
1836  ******************************
1837  *                            *
1838  *      Plugin Realization    *
1839  *                            *
1840  ******************************
1841  */
1842
1843
1844
1845 /* entry point to initialize the plug-in
1846  * initialize the plug-in itself
1847  * register the element factories and pad templates
1848  * register the features
1849  */
1850 gboolean
1851 gst_dvbsrc_plugin_init (GstPlugin * plugin)
1852 {
1853   GST_DEBUG_CATEGORY_INIT (gstdvbsrc_debug, "dvbsrc", 0, "DVB Source Element");
1854
1855   return gst_element_register (plugin, "dvbsrc", GST_RANK_NONE,
1856       GST_TYPE_DVBSRC);
1857 }
1858
1859 static GstFlowReturn
1860 gst_dvbsrc_read_device (GstDvbSrc * object, int size, GstBuffer ** buffer)
1861 {
1862   gint count = 0;
1863   gint ret_val = 0;
1864   GstBuffer *buf = gst_buffer_new_and_alloc (size);
1865   GstClockTime timeout = object->timeout * GST_USECOND;
1866   GstMapInfo map;
1867
1868   g_return_val_if_fail (GST_IS_BUFFER (buf), GST_FLOW_ERROR);
1869
1870   if (object->fd_dvr < 0)
1871     return GST_FLOW_ERROR;
1872
1873   gst_buffer_map (buf, &map, GST_MAP_WRITE);
1874   while (count < size) {
1875     ret_val = gst_poll_wait (object->poll, timeout);
1876     GST_LOG_OBJECT (object, "select returned %d", ret_val);
1877     if (G_UNLIKELY (ret_val < 0)) {
1878       if (errno == EBUSY)
1879         goto stopped;
1880       else if (errno == EINTR)
1881         continue;
1882       else
1883         goto select_error;
1884     } else if (G_UNLIKELY (!ret_val)) {
1885       /* timeout, post element message */
1886       gst_element_post_message (GST_ELEMENT_CAST (object),
1887           gst_message_new_element (GST_OBJECT (object),
1888               gst_structure_new_empty ("dvb-read-failure")));
1889     } else {
1890       int nread = read (object->fd_dvr, map.data + count, size - count);
1891
1892       if (G_UNLIKELY (nread < 0)) {
1893         GST_WARNING_OBJECT
1894             (object,
1895             "Unable to read from device: /dev/dvb/adapter%d/dvr%d (%d)",
1896             object->adapter_number, object->frontend_number, errno);
1897         gst_element_post_message (GST_ELEMENT_CAST (object),
1898             gst_message_new_element (GST_OBJECT (object),
1899                 gst_structure_new_empty ("dvb-read-failure")));
1900       } else
1901         count = count + nread;
1902     }
1903   }
1904   gst_buffer_unmap (buf, &map);
1905   gst_buffer_resize (buf, 0, count);
1906
1907   *buffer = buf;
1908
1909   return GST_FLOW_OK;
1910
1911 stopped:
1912   {
1913     GST_DEBUG_OBJECT (object, "stop called");
1914     gst_buffer_unmap (buf, &map);
1915     gst_buffer_unref (buf);
1916     return GST_FLOW_FLUSHING;
1917   }
1918 select_error:
1919   {
1920     GST_ELEMENT_ERROR (object, RESOURCE, READ, (NULL),
1921         ("select error %d: %s (%d)", ret_val, g_strerror (errno), errno));
1922     gst_buffer_unmap (buf, &map);
1923     gst_buffer_unref (buf);
1924     return GST_FLOW_ERROR;
1925   }
1926 }
1927
1928 static GstFlowReturn
1929 gst_dvbsrc_create (GstPushSrc * element, GstBuffer ** buf)
1930 {
1931   gint buffer_size;
1932   GstFlowReturn retval = GST_FLOW_ERROR;
1933   GstDvbSrc *object;
1934
1935   object = GST_DVBSRC (element);
1936   GST_LOG ("fd_dvr: %d", object->fd_dvr);
1937
1938   buffer_size = DEFAULT_BUFFER_SIZE;
1939
1940   /* device can not be tuned during read */
1941   g_mutex_lock (&object->tune_mutex);
1942
1943
1944   if (object->fd_dvr > -1) {
1945     /* --- Read TS from DVR device --- */
1946     GST_DEBUG_OBJECT (object, "Reading from DVR device");
1947     retval = gst_dvbsrc_read_device (object, buffer_size, buf);
1948
1949     if (object->stats_interval &&
1950         ++object->stats_counter == object->stats_interval) {
1951       gst_dvbsrc_output_frontend_stats (object);
1952       object->stats_counter = 0;
1953     }
1954   }
1955
1956   g_mutex_unlock (&object->tune_mutex);
1957
1958   return retval;
1959
1960 }
1961
1962 static GstStateChangeReturn
1963 gst_dvbsrc_change_state (GstElement * element, GstStateChange transition)
1964 {
1965   GstDvbSrc *src;
1966   GstStateChangeReturn ret;
1967
1968   src = GST_DVBSRC (element);
1969   ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
1970
1971   switch (transition) {
1972     case GST_STATE_CHANGE_NULL_TO_READY:
1973       /* open frontend then close it again, just so caps sent */
1974       if (!gst_dvbsrc_open_frontend (src, FALSE)) {
1975         GST_ERROR_OBJECT (src, "Could not open frontend device");
1976         ret = GST_STATE_CHANGE_FAILURE;
1977       }
1978       if (src->fd_frontend) {
1979         close (src->fd_frontend);
1980       }
1981       break;
1982     default:
1983       break;
1984   }
1985
1986   return ret;
1987 }
1988
1989
1990 static gboolean
1991 gst_dvbsrc_start (GstBaseSrc * bsrc)
1992 {
1993   GstDvbSrc *src = GST_DVBSRC (bsrc);
1994
1995   if (!gst_dvbsrc_open_frontend (src, TRUE)) {
1996     GST_ERROR_OBJECT (src, "Could not open frontend device");
1997     return FALSE;
1998   }
1999   if (!gst_dvbsrc_tune (src)) {
2000     GST_ERROR_OBJECT (src, "Not able to lock on channel");
2001     goto fail;
2002   }
2003   if (!gst_dvbsrc_open_dvr (src)) {
2004     GST_ERROR_OBJECT (src, "Not able to open DVR device");
2005     goto fail;
2006   }
2007   if (!(src->poll = gst_poll_new (TRUE))) {
2008     GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ_WRITE, (NULL),
2009         ("Could not create an fd set: %s (%d)", g_strerror (errno), errno));
2010     goto fail;
2011   }
2012
2013   gst_poll_fd_init (&src->poll_fd_dvr);
2014   src->poll_fd_dvr.fd = src->fd_dvr;
2015   gst_poll_add_fd (src->poll, &src->poll_fd_dvr);
2016   gst_poll_fd_ctl_read (src->poll, &src->poll_fd_dvr, TRUE);
2017
2018   return TRUE;
2019
2020 fail:
2021   gst_dvbsrc_unset_pes_filters (src);
2022   close (src->fd_frontend);
2023   return FALSE;
2024 }
2025
2026 static gboolean
2027 gst_dvbsrc_stop (GstBaseSrc * bsrc)
2028 {
2029   GstDvbSrc *src = GST_DVBSRC (bsrc);
2030
2031   gst_dvbsrc_close_devices (src);
2032   g_list_free (src->supported_delsys);
2033   src->supported_delsys = NULL;
2034   if (src->poll) {
2035     gst_poll_free (src->poll);
2036     src->poll = NULL;
2037   }
2038
2039   return TRUE;
2040 }
2041
2042 static gboolean
2043 gst_dvbsrc_unlock (GstBaseSrc * bsrc)
2044 {
2045   GstDvbSrc *src = GST_DVBSRC (bsrc);
2046
2047   gst_poll_set_flushing (src->poll, TRUE);
2048   return TRUE;
2049 }
2050
2051 static gboolean
2052 gst_dvbsrc_unlock_stop (GstBaseSrc * bsrc)
2053 {
2054   GstDvbSrc *src = GST_DVBSRC (bsrc);
2055
2056   gst_poll_set_flushing (src->poll, FALSE);
2057   return TRUE;
2058 }
2059
2060 static gboolean
2061 gst_dvbsrc_is_seekable (GstBaseSrc * bsrc)
2062 {
2063   return FALSE;
2064 }
2065
2066 static gboolean
2067 gst_dvbsrc_is_valid_trans_mode (guint delsys, guint mode)
2068 {
2069   /* FIXME: check valid transmission modes for other broadcast standards */
2070   switch (delsys) {
2071     case SYS_DVBT:
2072       if (mode == TRANSMISSION_MODE_AUTO || mode == TRANSMISSION_MODE_2K ||
2073           mode == TRANSMISSION_MODE_8K) {
2074         return TRUE;
2075       }
2076       break;
2077     case SYS_DVBT2:
2078       if (mode == TRANSMISSION_MODE_AUTO || mode == TRANSMISSION_MODE_1K ||
2079           mode == TRANSMISSION_MODE_2K || mode == TRANSMISSION_MODE_4K ||
2080           mode == TRANSMISSION_MODE_8K || mode == TRANSMISSION_MODE_16K ||
2081           mode == TRANSMISSION_MODE_32K) {
2082         return TRUE;
2083       }
2084       break;
2085 #if HAVE_V5_MINOR(7)
2086     case SYS_DTMB:
2087       if (mode == TRANSMISSION_MODE_AUTO || mode == TRANSMISSION_MODE_C1 ||
2088           mode == TRANSMISSION_MODE_C3780) {
2089         return TRUE;
2090       }
2091       break;
2092 #endif
2093     default:
2094       GST_FIXME ("No transmission-mode sanity checks implemented for this "
2095           "delivery system");
2096       return TRUE;
2097   }
2098   GST_WARNING ("Invalid transmission-mode '%d' for delivery system '%d'", mode,
2099       delsys);
2100   return FALSE;
2101 }
2102
2103 static gboolean
2104 gst_dvbsrc_is_valid_modulation (guint delsys, guint mod)
2105 {
2106   /* FIXME: check valid modulations for other broadcast standards */
2107   switch (delsys) {
2108     case SYS_ISDBT:
2109       if (mod == QAM_AUTO || mod == QPSK || mod == QAM_16 ||
2110           mod == QAM_64 || mod == DQPSK)
2111         return TRUE;
2112       break;
2113     case SYS_ATSC:
2114       if (mod == VSB_8 || mod == VSB_16)
2115         return TRUE;
2116       break;
2117     case SYS_DVBT:
2118       if (mod == QPSK || mod == QAM_16 || mod == QAM_64)
2119         return TRUE;
2120       break;
2121     case SYS_DVBT2:
2122       if (mod == QPSK || mod == QAM_16 || mod == QAM_64 || mod == QAM_256)
2123         return TRUE;
2124       break;
2125     default:
2126       GST_FIXME ("No modulation sanity-checks implemented for delivery "
2127           "system: '%d'", delsys);
2128       return TRUE;
2129   }
2130   GST_WARNING ("Invalid modulation '%d' for delivery system '%d'", mod, delsys);
2131   return FALSE;
2132 }
2133
2134 static gboolean
2135 gst_dvbsrc_is_valid_bandwidth (guint delsys, guint bw)
2136 {
2137   /* FIXME: check valid bandwidth values for other broadcast standards */
2138
2139   /* Bandwidth == 0 means auto, this should be valid for every delivery system
2140    * for which the bandwidth parameter makes sense */
2141
2142   switch (delsys) {
2143     case SYS_DVBT:
2144       if (bw == 6000000 || bw == 7000000 || bw == 8000000 || bw == 0)
2145         return TRUE;
2146       break;
2147     case SYS_DVBT2:
2148       if (bw == 1172000 || bw == 5000000 || bw == 6000000 || bw == 0 ||
2149           bw == 7000000 || bw == 8000000 || bw == 10000000) {
2150         return TRUE;
2151       }
2152       break;
2153     case SYS_ISDBT:
2154       if (bw == 6000000 || bw == 0)
2155         return TRUE;
2156       break;
2157     default:
2158       GST_FIXME ("No bandwidth sanity checks implemented for this "
2159           "delivery system");
2160       return TRUE;
2161   }
2162   GST_WARNING ("Invalid bandwidth '%d' for delivery system '%d'", bw, delsys);
2163   return FALSE;
2164 }
2165
2166 static gboolean
2167 gst_dvbsrc_get_size (GstBaseSrc * src, guint64 * size)
2168 {
2169   return FALSE;
2170 }
2171
2172 static void
2173 gst_dvbsrc_do_tune (GstDvbSrc * src)
2174 {
2175   /* if we are in paused/playing state tune now, otherwise in ready
2176    * to paused state change */
2177   if (GST_STATE (src) > GST_STATE_READY)
2178     gst_dvbsrc_tune (src);
2179 }
2180
2181 static void
2182 gst_dvbsrc_output_frontend_stats (GstDvbSrc * src)
2183 {
2184   fe_status_t status;
2185   guint16 snr, signal;
2186   guint32 ber, bad_blks;
2187   GstMessage *message;
2188   GstStructure *structure;
2189   int fe_fd = src->fd_frontend;
2190   gint err;
2191
2192   LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_STATUS, &status));
2193   if (!err) {
2194     structure = gst_structure_new ("dvb-frontend-stats",
2195         "status", G_TYPE_INT, status,
2196         "lock", G_TYPE_BOOLEAN, status & FE_HAS_LOCK, NULL);
2197   } else {
2198     GST_ERROR_OBJECT (src, "Error getting frontend status: '%s'",
2199         g_strerror (errno));
2200     return;
2201   }
2202
2203   errno = 0;
2204   LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_SIGNAL_STRENGTH, &signal));
2205   if (!err)
2206     gst_structure_set (structure, "signal", G_TYPE_INT, signal, NULL);
2207
2208   LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_SNR, &snr));
2209   if (!err)
2210     gst_structure_set (structure, "snr", G_TYPE_INT, snr, NULL);
2211
2212   LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_BER, &ber));
2213   if (!err)
2214     gst_structure_set (structure, "ber", G_TYPE_INT, ber, NULL);
2215
2216   LOOP_WHILE_EINTR (err, ioctl (fe_fd, FE_READ_UNCORRECTED_BLOCKS, &bad_blks));
2217   if (!err)
2218     gst_structure_set (structure, "unc", G_TYPE_INT, bad_blks, NULL);
2219
2220   if (errno)
2221     GST_WARNING_OBJECT (src,
2222         "There were errors getting frontend status information: '%s'",
2223         g_strerror (errno));
2224
2225   GST_INFO_OBJECT (src, "Frontend stats: %" GST_PTR_FORMAT, structure);
2226   message = gst_message_new_element (GST_OBJECT (src), structure);
2227   gst_element_post_message (GST_ELEMENT (src), message);
2228 }
2229
2230 static void
2231 diseqc_send_msg (int fd, fe_sec_voltage_t v, struct dvb_diseqc_master_cmd *cmd,
2232     fe_sec_tone_mode_t t, fe_sec_mini_cmd_t b)
2233 {
2234   gint err;
2235
2236   LOOP_WHILE_EINTR (err, ioctl (fd, FE_SET_TONE, SEC_TONE_OFF));
2237   if (err) {
2238     GST_ERROR ("Setting tone to off failed");
2239     return;
2240   }
2241
2242   LOOP_WHILE_EINTR (err, ioctl (fd, FE_SET_VOLTAGE, v));
2243   if (err) {
2244     GST_ERROR ("Setting voltage failed");
2245     return;
2246   }
2247
2248   g_usleep (15 * 1000);
2249   GST_LOG ("diseqc: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x", cmd->msg[0],
2250       cmd->msg[1], cmd->msg[2], cmd->msg[3], cmd->msg[4], cmd->msg[5]);
2251
2252   LOOP_WHILE_EINTR (err, ioctl (fd, FE_DISEQC_SEND_MASTER_CMD, cmd));
2253   if (err) {
2254     GST_ERROR ("Sending DiSEqC command failed");
2255     return;
2256   }
2257
2258   g_usleep (15 * 1000);
2259
2260   LOOP_WHILE_EINTR (err, ioctl (fd, FE_DISEQC_SEND_BURST, b));
2261   if (err) {
2262     GST_ERROR ("Sending burst failed");
2263     return;
2264   }
2265
2266   g_usleep (15 * 1000);
2267
2268   LOOP_WHILE_EINTR (err, ioctl (fd, FE_SET_TONE, t));
2269   if (err) {
2270     GST_ERROR ("Setting tone failed");
2271     return;
2272   }
2273 }
2274
2275
2276 /* digital satellite equipment control,
2277  * specification is available from http://www.eutelsat.com/
2278  */
2279 static void
2280 diseqc (int secfd, int sat_no, int voltage, int tone)
2281 {
2282   struct dvb_diseqc_master_cmd cmd =
2283       { {0xe0, 0x10, 0x38, 0xf0, 0x00, 0x00}, 4 };
2284
2285   /* param: high nibble: reset bits, low nibble set bits,
2286    * bits are: option, position, polarizaion, band
2287    */
2288   cmd.msg[3] =
2289       0xf0 | (((sat_no * 4) & 0x0f) | (tone == SEC_TONE_ON ? 1 : 0) |
2290       (voltage == SEC_VOLTAGE_13 ? 0 : 2));
2291   /* send twice because some DiSEqC switches do not respond correctly the
2292    * first time */
2293   diseqc_send_msg (secfd, voltage, &cmd, tone,
2294       sat_no % 2 ? SEC_MINI_B : SEC_MINI_A);
2295   diseqc_send_msg (secfd, voltage, &cmd, tone,
2296       sat_no % 2 ? SEC_MINI_B : SEC_MINI_A);
2297
2298 }
2299
2300 inline static void
2301 set_prop (struct dtv_property *props, int *n, guint32 cmd, guint32 data)
2302 {
2303   if (*n == NUM_DTV_PROPS) {
2304     g_critical ("Index out of bounds");
2305   } else {
2306     props[*n].cmd = cmd;
2307     props[(*n)++].u.data = data;
2308   }
2309 }
2310
2311 static gboolean
2312 gst_dvbsrc_tune_fe (GstDvbSrc * object)
2313 {
2314   fe_status_t status;
2315   struct dtv_properties props;
2316   struct dtv_property dvb_prop[NUM_DTV_PROPS];
2317   GstClockTimeDiff elapsed_time;
2318   GstClockTime start;
2319   gint err;
2320
2321   GST_DEBUG_OBJECT (object, "Starting the frontend tuning process");
2322
2323   if (object->fd_frontend < 0) {
2324     GST_INFO_OBJECT (object, "Frontend not open: tuning later");
2325     return FALSE;
2326   }
2327
2328   /* If set, confirm the choosen delivery system is actually
2329    * supported by the hardware */
2330   if (object->delsys != SYS_UNDEFINED) {
2331     GST_DEBUG_OBJECT (object, "Confirming delivery system '%u' is supported",
2332         object->delsys);
2333     if (!g_list_find (object->supported_delsys,
2334             GINT_TO_POINTER (object->delsys))) {
2335       GST_WARNING_OBJECT (object, "Adapter does not support delivery system "
2336           "'%u'", object->delsys);
2337       return FALSE;
2338     }
2339   }
2340
2341   gst_dvbsrc_unset_pes_filters (object);
2342
2343   g_mutex_lock (&object->tune_mutex);
2344
2345   memset (dvb_prop, 0, sizeof (dvb_prop));
2346   dvb_prop[0].cmd = DTV_CLEAR;
2347   props.num = 1;
2348   props.props = dvb_prop;
2349
2350   LOOP_WHILE_EINTR (err, ioctl (object->fd_frontend, FE_SET_PROPERTY, &props));
2351   if (err) {
2352     GST_WARNING_OBJECT (object, "Error resetting tuner: %s",
2353         g_strerror (errno));
2354   }
2355
2356   memset (dvb_prop, 0, sizeof (dvb_prop));
2357   if (!gst_dvbsrc_set_fe_params (object, &props)) {
2358     GST_WARNING_OBJECT (object, "Could not set frontend params");
2359     goto fail;
2360   }
2361
2362   GST_DEBUG_OBJECT (object, "Setting %d properties", props.num);
2363
2364   LOOP_WHILE_EINTR (err, ioctl (object->fd_frontend, FE_SET_PROPERTY, &props));
2365   if (err) {
2366     GST_WARNING_OBJECT (object, "Error tuning channel: %s (%d)",
2367         g_strerror (errno), errno);
2368     goto fail;
2369   }
2370
2371   g_signal_emit (object, gst_dvbsrc_signals[SIGNAL_TUNING_START], 0);
2372   elapsed_time = 0;
2373   start = gst_util_get_timestamp ();
2374
2375   /* signal locking loop */
2376   do {
2377     LOOP_WHILE_EINTR (err, ioctl (object->fd_frontend, FE_READ_STATUS,
2378             &status));
2379     if (err) {
2380       GST_WARNING_OBJECT (object, "Failed querying frontend for tuning status"
2381           " %s (%d)", g_strerror (errno), errno);
2382       goto fail_with_signal;
2383     }
2384     gst_dvbsrc_output_frontend_stats (object);
2385     /* keep retrying forever if tuning_timeout = 0 */
2386     if (object->tuning_timeout)
2387       elapsed_time = GST_CLOCK_DIFF (start, gst_util_get_timestamp ());
2388     GST_LOG_OBJECT (object,
2389         "Tuning. Time elapsed %" GST_STIME_FORMAT " Limit %" GST_TIME_FORMAT,
2390         GST_STIME_ARGS (elapsed_time), GST_TIME_ARGS (object->tuning_timeout));
2391   } while (!(status & FE_HAS_LOCK) && elapsed_time <= object->tuning_timeout);
2392
2393   if (!(status & FE_HAS_LOCK)) {
2394     GST_WARNING_OBJECT (object,
2395         "Unable to lock on signal at desired frequency");
2396     goto fail_with_signal;
2397   }
2398
2399   GST_LOG_OBJECT (object, "status == 0x%02x", status);
2400
2401   g_signal_emit (object, gst_dvbsrc_signals[SIGNAL_TUNING_DONE], 0);
2402   GST_DEBUG_OBJECT (object, "Successfully set frontend tuning params");
2403
2404   g_mutex_unlock (&object->tune_mutex);
2405   return TRUE;
2406
2407 fail_with_signal:
2408   g_signal_emit (object, gst_dvbsrc_signals[SIGNAL_TUNING_FAIL], 0);
2409 fail:
2410   GST_WARNING_OBJECT (object, "Could not tune to desired frequency");
2411   g_mutex_unlock (&object->tune_mutex);
2412   return FALSE;
2413 }
2414
2415 static void
2416 gst_dvbsrc_guess_delsys (GstDvbSrc * object)
2417 {
2418   GList *valid, *candidate;
2419   guint alternatives;
2420
2421   if (g_list_length (object->supported_delsys) == 1) {
2422     object->delsys = GPOINTER_TO_INT (object->supported_delsys->data);
2423     GST_DEBUG_OBJECT (object, "Adapter supports a single delsys: '%u'",
2424         object->delsys);
2425     goto autoselection_done;
2426   }
2427
2428   /* Automatic delivery system selection based on known-correct
2429    * parameter combinations */
2430
2431   valid = g_list_copy (object->supported_delsys);
2432
2433   candidate = valid;
2434   while (candidate) {
2435     GList *next = candidate->next;
2436     if (!gst_dvbsrc_is_valid_modulation (GPOINTER_TO_INT (candidate->data),
2437             object->modulation) ||
2438         !gst_dvbsrc_is_valid_trans_mode (GPOINTER_TO_INT (candidate->data),
2439             object->transmission_mode) ||
2440         !gst_dvbsrc_is_valid_bandwidth (GPOINTER_TO_INT (candidate->data),
2441             object->bandwidth)) {
2442       valid = g_list_delete_link (valid, candidate);
2443     }
2444     candidate = next;
2445   }
2446
2447   alternatives = g_list_length (valid);
2448
2449   switch (alternatives) {
2450     case 0:
2451       GST_WARNING_OBJECT (object, "Delivery system autodetection provided no "
2452           "valid alternative");
2453       candidate = g_list_last (object->supported_delsys);
2454       break;
2455     case 1:
2456       candidate = g_list_last (valid);
2457       GST_DEBUG_OBJECT (object, "Delivery system autodetection provided only "
2458           "one valid alternative: '%d'", GPOINTER_TO_INT (candidate->data));
2459       break;
2460     default:
2461       /* More than one alternative. Selection based on best guess */
2462       if (g_list_find (valid, GINT_TO_POINTER (SYS_DVBT)) &&
2463           g_list_find (valid, GINT_TO_POINTER (SYS_DVBT2))) {
2464         /* There is no way to tell one over the other when parameters seem valid
2465          * for DVB-T and DVB-T2 and the adapter supports both. Reason to go with
2466          * the former here is that, from experience, most DVB-T2 channels out
2467          * there seem to use parameters that are not valid for DVB-T, like
2468          * QAM_256 */
2469         GST_WARNING_OBJECT (object, "Channel parameters valid for DVB-T and "
2470             "DVB-T2. Choosing DVB-T");
2471         candidate = g_list_find (valid, GINT_TO_POINTER (SYS_DVBT));
2472       } else {
2473         candidate = g_list_last (valid);
2474       }
2475   }
2476
2477   object->delsys = GPOINTER_TO_INT (candidate->data);
2478   g_list_free (valid);
2479
2480 autoselection_done:
2481   GST_INFO_OBJECT (object, "Automatically selecting delivery system '%u'",
2482       object->delsys);
2483 }
2484
2485 static gboolean
2486 gst_dvbsrc_set_fe_params (GstDvbSrc * object, struct dtv_properties *props)
2487 {
2488   fe_sec_voltage_t voltage;
2489   unsigned int freq = object->freq;
2490   unsigned int sym_rate = object->sym_rate * 1000;
2491   int inversion = object->inversion;
2492   int n;
2493   gint err;
2494
2495   /* If delsys hasn't been set, ask for it to be automatically selected */
2496   if (object->delsys == SYS_UNDEFINED)
2497     gst_dvbsrc_guess_delsys (object);
2498
2499   /* first 3 entries are reserved */
2500   n = 3;
2501
2502   /* We are not dropping out but issuing a warning in case of wrong
2503    * parameter combinations as failover behavior should be mandated
2504    * by the driver. Worst case scenario it will just fail at tuning. */
2505
2506   switch (object->delsys) {
2507     case SYS_DVBS:
2508     case SYS_DVBS2:
2509     case SYS_TURBO:
2510       if (freq > 2200000) {
2511         /* this must be an absolute frequency */
2512         if (freq < object->lnb_slof) {
2513           freq -= object->lnb_lof1;
2514           object->tone = SEC_TONE_OFF;
2515         } else {
2516           freq -= object->lnb_lof2;
2517           object->tone = SEC_TONE_ON;
2518         }
2519       }
2520
2521       inversion = INVERSION_AUTO;
2522       set_prop (props->props, &n, DTV_SYMBOL_RATE, sym_rate);
2523       set_prop (props->props, &n, DTV_INNER_FEC, object->code_rate_hp);
2524
2525       GST_INFO_OBJECT (object,
2526           "Tuning DVB-S/DVB-S2/Turbo to L-Band:%u, Pol:%d, srate=%u, 22kHz=%s",
2527           freq, object->pol, sym_rate,
2528           object->tone == SEC_TONE_ON ? "on" : "off");
2529
2530       if (object->pol == DVB_POL_H)
2531         voltage = SEC_VOLTAGE_18;
2532       else
2533         voltage = SEC_VOLTAGE_13;
2534
2535       if (object->diseqc_src == -1 || object->send_diseqc == FALSE) {
2536         set_prop (props->props, &n, DTV_VOLTAGE, voltage);
2537
2538         /* DTV_TONE not yet implemented
2539          * set_prop (fe_props_array, &n, DTV_TONE, object->tone) */
2540         LOOP_WHILE_EINTR (err, ioctl (object->fd_frontend, FE_SET_TONE,
2541                 object->tone));
2542         if (err) {
2543           GST_WARNING_OBJECT (object, "Couldn't set tone: %s",
2544               g_strerror (errno));
2545         }
2546       } else {
2547         GST_DEBUG_OBJECT (object, "Sending DiSEqC");
2548         diseqc (object->fd_frontend, object->diseqc_src, voltage, object->tone);
2549         /* Once DiSEqC source is set, do not set it again until
2550          * app decides to change it
2551          * object->send_diseqc = FALSE; */
2552       }
2553
2554       if ((object->delsys == SYS_DVBS2) || (object->delsys == SYS_TURBO))
2555         set_prop (props->props, &n, DTV_MODULATION, object->modulation);
2556
2557       if (object->delsys == SYS_DVBS2) {
2558         if (object->stream_id > 255) {
2559           GST_WARNING_OBJECT (object, "Invalid (> 255) DVB-S2 stream ID '%d'. "
2560               "Disabling sub-stream filtering", object->stream_id);
2561           object->stream_id = NO_STREAM_ID_FILTER;
2562         }
2563         set_prop (props->props, &n, DTV_PILOT, object->pilot);
2564         set_prop (props->props, &n, DTV_ROLLOFF, object->rolloff);
2565         set_prop (props->props, &n, DTV_STREAM_ID, object->stream_id);
2566       }
2567       break;
2568     case SYS_DVBT:
2569     case SYS_DVBT2:
2570       set_prop (props->props, &n, DTV_BANDWIDTH_HZ, object->bandwidth);
2571       set_prop (props->props, &n, DTV_CODE_RATE_HP, object->code_rate_hp);
2572       set_prop (props->props, &n, DTV_CODE_RATE_LP, object->code_rate_lp);
2573       set_prop (props->props, &n, DTV_MODULATION, object->modulation);
2574       set_prop (props->props, &n, DTV_TRANSMISSION_MODE,
2575           object->transmission_mode);
2576       set_prop (props->props, &n, DTV_GUARD_INTERVAL, object->guard_interval);
2577       set_prop (props->props, &n, DTV_HIERARCHY, object->hierarchy_information);
2578
2579       if (object->delsys == SYS_DVBT2) {
2580         if (object->stream_id > 255) {
2581           GST_WARNING_OBJECT (object, "Invalid (> 255) DVB-T2 stream ID '%d'. "
2582               "Disabling sub-stream filtering", object->stream_id);
2583           object->stream_id = NO_STREAM_ID_FILTER;
2584         }
2585         set_prop (props->props, &n, DTV_STREAM_ID, object->stream_id);
2586       }
2587
2588       GST_INFO_OBJECT (object, "Tuning DVB-T/DVB_T2 to %d Hz", freq);
2589       break;
2590     case SYS_DVBC_ANNEX_A:
2591     case SYS_DVBC_ANNEX_B:
2592 #if HAVE_V5_MINOR(6)
2593     case SYS_DVBC_ANNEX_C:
2594 #endif
2595       GST_INFO_OBJECT (object, "Tuning DVB-C/ClearCable to %d, srate=%d",
2596           freq, sym_rate);
2597
2598       set_prop (props->props, &n, DTV_MODULATION, object->modulation);
2599       if (object->delsys != SYS_DVBC_ANNEX_B) {
2600         set_prop (props->props, &n, DTV_INNER_FEC, object->code_rate_hp);
2601         set_prop (props->props, &n, DTV_SYMBOL_RATE, sym_rate);
2602       }
2603       break;
2604     case SYS_ATSC:
2605       GST_INFO_OBJECT (object, "Tuning ATSC to %d", freq);
2606
2607       set_prop (props->props, &n, DTV_MODULATION, object->modulation);
2608       break;
2609     case SYS_ISDBT:
2610
2611       if (object->isdbt_partial_reception == 1 &&
2612           object->isdbt_layera_segment_count != 1) {
2613         GST_WARNING_OBJECT (object, "Wrong ISDB-T parameter combination: "
2614             "partial reception is set but layer A segment count is not 1");
2615       }
2616
2617       if (!object->isdbt_sound_broadcasting) {
2618         GST_INFO_OBJECT (object, "ISDB-T sound broadcasting is not set. "
2619             "Driver will likely ignore values set for isdbt-sb-subchannel-id, "
2620             "isdbt-sb-segment-idx and isdbt-sb-segment-count");
2621       }
2622
2623       if (object->isdbt_layerc_modulation == DQPSK &&
2624           object->isdbt_layerb_modulation != DQPSK) {
2625         GST_WARNING_OBJECT (object, "Wrong ISDB-T parameter combination: "
2626             "layer C modulation is DQPSK but layer B modulation is different");
2627       }
2628
2629       GST_INFO_OBJECT (object, "Tuning ISDB-T to %d", freq);
2630       set_prop (props->props, &n, DTV_BANDWIDTH_HZ, object->bandwidth);
2631       set_prop (props->props, &n, DTV_GUARD_INTERVAL, object->guard_interval);
2632       set_prop (props->props, &n, DTV_TRANSMISSION_MODE,
2633           object->transmission_mode);
2634       set_prop (props->props, &n, DTV_ISDBT_LAYER_ENABLED,
2635           object->isdbt_layer_enabled);
2636       set_prop (props->props, &n, DTV_ISDBT_PARTIAL_RECEPTION,
2637           object->isdbt_partial_reception);
2638       set_prop (props->props, &n, DTV_ISDBT_SOUND_BROADCASTING,
2639           object->isdbt_sound_broadcasting);
2640       set_prop (props->props, &n, DTV_ISDBT_SB_SUBCHANNEL_ID,
2641           object->isdbt_sb_subchannel_id);
2642       set_prop (props->props, &n, DTV_ISDBT_SB_SEGMENT_IDX,
2643           object->isdbt_sb_segment_idx);
2644       set_prop (props->props, &n, DTV_ISDBT_SB_SEGMENT_COUNT,
2645           object->isdbt_sb_segment_count);
2646       set_prop (props->props, &n, DTV_ISDBT_LAYERA_FEC,
2647           object->isdbt_layera_fec);
2648       set_prop (props->props, &n, DTV_ISDBT_LAYERA_MODULATION,
2649           object->isdbt_layera_modulation);
2650       set_prop (props->props, &n, DTV_ISDBT_LAYERA_SEGMENT_COUNT,
2651           object->isdbt_layera_segment_count);
2652       set_prop (props->props, &n, DTV_ISDBT_LAYERA_TIME_INTERLEAVING,
2653           object->isdbt_layera_time_interleaving);
2654       set_prop (props->props, &n, DTV_ISDBT_LAYERB_FEC,
2655           object->isdbt_layerb_fec);
2656       set_prop (props->props, &n, DTV_ISDBT_LAYERB_MODULATION,
2657           object->isdbt_layerb_modulation);
2658       set_prop (props->props, &n, DTV_ISDBT_LAYERB_SEGMENT_COUNT,
2659           object->isdbt_layerb_segment_count);
2660       set_prop (props->props, &n, DTV_ISDBT_LAYERB_TIME_INTERLEAVING,
2661           object->isdbt_layerb_time_interleaving);
2662       set_prop (props->props, &n, DTV_ISDBT_LAYERC_FEC,
2663           object->isdbt_layerc_fec);
2664       set_prop (props->props, &n, DTV_ISDBT_LAYERC_MODULATION,
2665           object->isdbt_layerc_modulation);
2666       set_prop (props->props, &n, DTV_ISDBT_LAYERC_SEGMENT_COUNT,
2667           object->isdbt_layerc_segment_count);
2668       set_prop (props->props, &n, DTV_ISDBT_LAYERC_TIME_INTERLEAVING,
2669           object->isdbt_layerc_time_interleaving);
2670       break;
2671 #if HAVE_V5_MINOR(7)
2672     case SYS_DTMB:
2673       set_prop (props->props, &n, DTV_BANDWIDTH_HZ, object->bandwidth);
2674       set_prop (props->props, &n, DTV_MODULATION, object->modulation);
2675       set_prop (props->props, &n, DTV_INVERSION, object->inversion);
2676       set_prop (props->props, &n, DTV_INNER_FEC, object->code_rate_hp);
2677       set_prop (props->props, &n, DTV_TRANSMISSION_MODE,
2678           object->transmission_mode);
2679       set_prop (props->props, &n, DTV_GUARD_INTERVAL, object->guard_interval);
2680       set_prop (props->props, &n, DTV_INTERLEAVING, object->interleaving);
2681       /* FIXME: Make the LNA on/off switch a property and proxy on dvbbasebin */
2682       /* FIXME: According to v4l advice (see libdvbv5 implementation) this
2683        * property should be set separately as not all drivers will ignore it
2684        * if unsupported. An alternative would be to get the dvb API contract
2685        * revised on this regard */
2686       set_prop (props->props, &n, DTV_LNA, LNA_AUTO);
2687       GST_INFO_OBJECT (object, "Tuning DTMB to %d Hz", freq);
2688       break;
2689 #endif
2690     default:
2691       GST_ERROR_OBJECT (object, "Unknown frontend type %u", object->delsys);
2692       return FALSE;
2693   }
2694
2695   /* Informative checks */
2696   if (!gst_dvbsrc_is_valid_modulation (object->delsys, object->modulation)) {
2697     GST_WARNING_OBJECT (object,
2698         "Attempting invalid modulation '%u' for delivery system '%u'",
2699         object->modulation, object->delsys);
2700   }
2701   if (!gst_dvbsrc_is_valid_trans_mode (object->delsys,
2702           object->transmission_mode)) {
2703     GST_WARNING_OBJECT (object,
2704         "Attempting invalid transmission mode '%u' for delivery system '%u'",
2705         object->transmission_mode, object->delsys);
2706   }
2707   if (!gst_dvbsrc_is_valid_bandwidth (object->delsys, object->bandwidth)) {
2708     GST_WARNING_OBJECT (object,
2709         "Attempting invalid bandwidth '%u' for delivery system '%u'",
2710         object->bandwidth, object->delsys);
2711   }
2712
2713   set_prop (props->props, &n, DTV_TUNE, 0);
2714   props->num = n;
2715   /* set first three entries */
2716   n = 0;
2717   set_prop (props->props, &n, DTV_DELIVERY_SYSTEM, object->delsys);
2718   set_prop (props->props, &n, DTV_FREQUENCY, freq);
2719   set_prop (props->props, &n, DTV_INVERSION, inversion);
2720
2721   return TRUE;
2722 }
2723
2724 static gboolean
2725 gst_dvbsrc_tune (GstDvbSrc * object)
2726 {
2727   /* found in mail archive on linuxtv.org
2728    * What works well for us is:
2729    * - first establish a TS feed (i.e. tune the frontend and check for success)
2730    * - then set filters (PES/sections)
2731    * - then tell the MPEG decoder to start
2732    * - before tuning: first stop the MPEG decoder, then stop all filters
2733    */
2734   if (!gst_dvbsrc_tune_fe (object)) {
2735     GST_WARNING_OBJECT (object, "Unable to tune frontend");
2736     return FALSE;
2737   }
2738
2739   gst_dvbsrc_set_pes_filters (object);
2740
2741   return TRUE;
2742 }
2743
2744
2745 static void
2746 gst_dvbsrc_unset_pes_filters (GstDvbSrc * object)
2747 {
2748   int i = 0;
2749
2750   GST_INFO_OBJECT (object, "clearing PES filter");
2751
2752   for (i = 0; i < MAX_FILTERS; i++) {
2753     if (object->fd_filters[i] == -1)
2754       continue;
2755     close (object->fd_filters[i]);
2756     object->fd_filters[i] = -1;
2757   }
2758 }
2759
2760 static void
2761 gst_dvbsrc_set_pes_filters (GstDvbSrc * object)
2762 {
2763   int *fd;
2764   int pid, i;
2765   struct dmx_pes_filter_params pes_filter;
2766   gint err;
2767   gchar *demux_dev = g_strdup_printf ("/dev/dvb/adapter%d/demux%d",
2768       object->adapter_number, object->frontend_number);
2769
2770   GST_INFO_OBJECT (object, "Setting PES filter");
2771
2772   /* Set common params for all filters */
2773   pes_filter.input = DMX_IN_FRONTEND;
2774   pes_filter.output = DMX_OUT_TS_TAP;
2775   pes_filter.pes_type = DMX_PES_OTHER;
2776   pes_filter.flags = DMX_IMMEDIATE_START;
2777
2778   for (i = 0; i < MAX_FILTERS; i++) {
2779     if (object->pids[i] == G_MAXUINT16)
2780       break;
2781
2782     fd = &object->fd_filters[i];
2783     pid = object->pids[i];
2784
2785     if (*fd >= 0)
2786       close (*fd);
2787     if ((*fd = open (demux_dev, O_RDWR)) < 0) {
2788       GST_ERROR_OBJECT (object, "Error opening demuxer: %s (%s)",
2789           g_strerror (errno), demux_dev);
2790       continue;
2791     }
2792     g_return_if_fail (*fd != -1);
2793
2794     pes_filter.pid = pid;
2795
2796     GST_INFO_OBJECT (object, "Setting PES filter: pid = %d, type = %d",
2797         pes_filter.pid, pes_filter.pes_type);
2798
2799     LOOP_WHILE_EINTR (err, ioctl (*fd, DMX_SET_PES_FILTER, &pes_filter));
2800     if (err)
2801       GST_WARNING_OBJECT (object, "Error setting PES filter on %s: %s",
2802           demux_dev, g_strerror (errno));
2803   }
2804
2805   g_free (demux_dev);
2806 }