summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
Diffstat (limited to 'sys')
-rw-r--r--sys/dvb/gstdvbsrc.c178
-rw-r--r--sys/dvb/gstdvbsrc.h6
2 files changed, 94 insertions, 90 deletions
diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c
index 2ad55ffe..d5fb8b69 100644
--- a/sys/dvb/gstdvbsrc.c
+++ b/sys/dvb/gstdvbsrc.c
@@ -64,21 +64,21 @@ static GstElementDetails dvbsrc_details = {
* <title>Example launch line</title>
* <para>
* <programlisting>
- * gst-launch dvbsrc modulation="QAM 64" trans-mode=8k bandwidth=8MHz freq=514000000 code-rate-lp=AUTO code-rate-hp=2/3 guard=4 hierarchy=0 ! flutsdemux crc-check=false name=demux ! queue max-size-buffers=0 max-size-time=0 ! flumpeg2vdec ! xvimagesink sync=false demux. ! queue max-size-buffers=0 max-size-time=0 ! flump3dec ! alsasink sync=false
+ * gst-launch dvbsrc modulation="QAM 64" trans-mode=8k bandwidth=8MHz frequency=514000000 code-rate-lp=AUTO code-rate-hp=2/3 guard=4 hierarchy=0 ! flutsdemux crc-check=false name=demux ! queue max-size-buffers=0 max-size-time=0 ! flumpeg2vdec ! xvimagesink sync=false demux. ! queue max-size-buffers=0 max-size-time=0 ! flump3dec ! alsasink sync=false
* </programlisting>
* This pipeline captures a full transport stream from dvb card 0 that is a DVB-T card at tuned frequency 514000000 with other parameters as seen in the
* pipeline and outputs the first tv program on the transport stream. The reason the sinks have to be set to have sync=false is due to bug #340482.
* </para>
* <para>
* <programlisting>
- * gst-launch dvbsrc modulation="QAM 64" trans-mode=8k bandwidth=8 freq=514000000 code-rate-lp=AUTO code-rate-hp=2/3 guard=4 hierarchy=0 pids=256:257 ! flutsdemux crc-check=false name=demux es-pids=256:257 ! queue max-size-buffers=0 max-size-time=0 ! flumpeg2vdec ! xvimagesink sync=false demux. ! queue max-size-buffers=0 max-size-time=0 ! flump3dec ! alsasink sync=false
+ * gst-launch 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=256:257 ! flutsdemux crc-check=false name=demux es-pids=256:257 ! queue max-size-buffers=0 max-size-time=0 ! flumpeg2vdec ! xvimagesink sync=false demux. ! queue max-size-buffers=0 max-size-time=0 ! flump3dec ! alsasink sync=false
* </programlisting>
* This pipeline captures a partial transport stream from dvb card 0 that is a DVB-T card for a program at tuned frequency 514000000 and pids of 256:257 with other parameters as seen in the pipeline and outputs the program with the pids 256 and 257. The reason the sinks have to be set to
* have sync=false is due to bug #340482.
* </para>
* <para>
* <programlisting>
- * gst-launch dvbsrc polarity="h" freq=11302000 srate=27500 diseqc-src=0 pids=102:103 ! queue max-size-buffers=0 max-size-time=0 ! flumpeg2vdec ! xvimagesink sync=false demux. ! queue max-size-buffers=0 max-size-time=0 ! flump3dec ! alsasink sync=false
+ * gst-launch dvbsrc polarity="h" frequency=11302000 srate=27500 diseqc-src=0 pids=102:103 ! queue max-size-buffers=0 max-size-time=0 ! flumpeg2vdec ! xvimagesink sync=false demux. ! queue max-size-buffers=0 max-size-time=0 ! flump3dec ! alsasink sync=false
* </programlisting>
* This pipeline captures a partial transport stream from dvb card 0 that is a DVB-S card for a program at tuned frequency 11302000 Hz, symbol rate of 27500 kHz and pids of 256:257 and outputs the program with the pids 256 and 257. The reason the sinks have to be set to have sync=false is due to bug #340482.
* </para>
@@ -89,10 +89,11 @@ static GstElementDetails dvbsrc_details = {
enum
{
ARG_0,
- ARG_DVBSRC_DEVICE,
+ ARG_DVBSRC_ADAPTER,
+ ARG_DVBSRC_FRONTEND,
ARG_DVBSRC_DISEQC_SRC,
- ARG_DVBSRC_FREQ,
- ARG_DVBSRC_POL,
+ ARG_DVBSRC_FREQUENCY,
+ ARG_DVBSRC_POLARITY,
ARG_DVBSRC_PIDS,
ARG_DVBSRC_SYM_RATE,
ARG_DVBSRC_BANDWIDTH,
@@ -334,19 +335,25 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass)
gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_dvbsrc_get_size);
gstpushsrc_class->create = gst_dvbsrc_create;
+ g_object_class_install_property (gobject_class, ARG_DVBSRC_ADAPTER,
+ g_param_spec_int ("adapter",
+ "The adapter device number",
+ "The adapter device number (eg. 0 for adapter0)", 0, 16, 0,
+ G_PARAM_READWRITE));
- g_object_class_install_property (gobject_class, ARG_DVBSRC_DEVICE,
- g_param_spec_string ("device",
- "device",
- "The device directory", "/dev/dvb/adapter0", G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class, ARG_DVBSRC_FRONTEND,
+ g_param_spec_int ("frontend",
+ "The frontend device number",
+ "The frontend device number (eg. 0 for frontend0)", 0, 16, 0,
+ G_PARAM_READWRITE));
- g_object_class_install_property (gobject_class, ARG_DVBSRC_FREQ,
- g_param_spec_int ("freq",
- "freq", "Frequency", 0, G_MAXINT, 0, G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class, ARG_DVBSRC_FREQUENCY,
+ g_param_spec_int ("frequency",
+ "frequency", "Frequency", 0, G_MAXINT, 0, G_PARAM_READWRITE));
- g_object_class_install_property (gobject_class, ARG_DVBSRC_POL,
- g_param_spec_string ("pol",
- "pol", "Polarity [vhHV] (DVB-S)", "h", G_PARAM_READWRITE));
+ g_object_class_install_property (gobject_class, ARG_DVBSRC_POLARITY,
+ g_param_spec_string ("polarity",
+ "polarity", "Polarity [vhHV] (DVB-S)", "h", G_PARAM_READWRITE));
g_object_class_install_property (gobject_class, ARG_DVBSRC_PIDS,
@@ -356,8 +363,8 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass)
"8192", G_PARAM_WRITABLE));
g_object_class_install_property (gobject_class, ARG_DVBSRC_SYM_RATE,
- g_param_spec_int ("srate",
- "srate",
+ g_param_spec_int ("symbol-rate",
+ "symbol rate",
"Symbol Rate (DVB-S, DVB-C)",
0, G_MAXINT, DEFAULT_SYMBOL_RATE, G_PARAM_READWRITE));
@@ -366,8 +373,8 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass)
"tune", "Atomically tune to channel. (For Apps)", G_PARAM_WRITABLE));
g_object_class_install_property (gobject_class, ARG_DVBSRC_DISEQC_SRC,
- g_param_spec_int ("diseqc_src",
- "diseqc_src",
+ g_param_spec_int ("diseqc-source",
+ "diseqc source",
"DISEqC selected source (-1 disabled) (DVB-S)",
-1, 7, DEFAULT_DISEQC_SRC, G_PARAM_READWRITE));
@@ -447,12 +454,8 @@ gst_dvbsrc_init (GstDvbSrc * object, GstDvbSrcClass * klass)
/* Pid 8192 on DVB gets the whole transport stream */
object->pids[0] = 8192;
- /* Setting standard devices */
- object->device = g_strdup (DEFAULT_DEVICE);
- object->frontend_dev = g_strconcat (object->device, "/frontend0", NULL);
- object->demux_dev = g_strconcat (object->device, "/demux0", NULL);
- object->dvr_dev = g_strconcat (object->device, "/dvr0", NULL);
-
+ object->adapter_number = 0;
+ object->frontend_number = 0;
object->sym_rate = DEFAULT_SYMBOL_RATE;
object->diseqc_src = DEFAULT_DISEQC_SRC;
object->send_diseqc = FALSE;
@@ -471,24 +474,11 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id,
object = GST_DVBSRC (_object);
switch (prop_id) {
- case ARG_DVBSRC_DEVICE:
- {
- char delim_str[] = "/\0";
-
- if (object->device != NULL)
- g_free (object->device);
- object->device = g_value_dup_string (value);
-
- if (g_str_has_suffix (object->device, "/"))
- delim_str[0] = '\0';
-
- object->frontend_dev =
- g_strconcat (object->device, delim_str, "frontend0", NULL);
- object->demux_dev =
- g_strconcat (object->device, delim_str, "demux0", NULL);
- object->dvr_dev = g_strconcat (object->device, delim_str, "dvr0", NULL);
- }
- GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_DEVICE");
+ case ARG_DVBSRC_ADAPTER:
+ object->adapter_number = g_value_get_int (value);
+ break;
+ case ARG_DVBSRC_FRONTEND:
+ object->frontend_number = g_value_get_int (value);
break;
case ARG_DVBSRC_DISEQC_SRC:
if (object->diseqc_src != g_value_get_int (value)) {
@@ -497,11 +487,11 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id,
}
GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_DISEQC_ID");
break;
- case ARG_DVBSRC_FREQ:
+ case ARG_DVBSRC_FREQUENCY:
object->freq = g_value_get_int (value);
- GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_FREQ");
+ GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_FREQUENCY");
break;
- case ARG_DVBSRC_POL:
+ case ARG_DVBSRC_POLARITY:
{
const char *s = NULL;
@@ -509,7 +499,7 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id,
if (s != NULL)
object->pol = (s[0] == 'h' || s[0] == 'H') ? DVB_POL_H : DVB_POL_V;
}
- GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_POL");
+ GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_POLARITY");
break;
case ARG_DVBSRC_PIDS:
{
@@ -588,7 +578,6 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id,
}
-
static void
gst_dvbsrc_get_property (GObject * _object, guint prop_id,
GValue * value, GParamSpec * pspec)
@@ -599,13 +588,16 @@ gst_dvbsrc_get_property (GObject * _object, guint prop_id,
object = GST_DVBSRC (_object);
switch (prop_id) {
- case ARG_DVBSRC_DEVICE:
- g_value_set_string (value, object->device);
+ case ARG_DVBSRC_ADAPTER:
+ g_value_set_int (value, object->adapter_number);
+ break;
+ case ARG_DVBSRC_FRONTEND:
+ g_value_set_int (value, object->frontend_number);
break;
- case ARG_DVBSRC_FREQ:
+ case ARG_DVBSRC_FREQUENCY:
g_value_set_int (value, object->freq);
break;
- case ARG_DVBSRC_POL:
+ case ARG_DVBSRC_POLARITY:
if (object->pol == DVB_POL_H)
g_value_set_string (value, "H");
else
@@ -640,37 +632,38 @@ gst_dvbsrc_open_frontend (GstDvbSrc * object)
{
struct dvb_frontend_info fe_info;
char *adapter_desc = NULL;
+ gchar *frontend_dev;
- GST_INFO_OBJECT (object, "Using frontend device: %s", object->frontend_dev);
- GST_INFO_OBJECT (object, "Using dvr device: %s", object->dvr_dev);
+ frontend_dev = g_strdup_printf ("/dev/dvb/adapter%d/frontend%d",
+ object->adapter_number, object->frontend_number);
+ GST_INFO_OBJECT (object, "Using frontend device: %s", frontend_dev);
/* open frontend */
- if ((object->fd_frontend = open (object->frontend_dev, O_RDWR)) < 0) {
+ if ((object->fd_frontend = open (frontend_dev, O_RDWR)) < 0) {
switch (errno) {
case ENOENT:
GST_ELEMENT_ERROR (object, RESOURCE, NOT_FOUND,
- (_("Device \"%s\" does not exist."), object->frontend_dev), (NULL));
+ (_("Device \"%s\" does not exist."), frontend_dev), (NULL));
break;
default:
GST_ELEMENT_ERROR (object, RESOURCE, OPEN_READ_WRITE,
- (_("Could not open frontend device \"%s\"."), object->frontend_dev),
+ (_("Could not open frontend device \"%s\"."), frontend_dev),
GST_ERROR_SYSTEM);
break;
}
- close (object->fd_dvr);
-
+ close (object->fd_frontend);
+ g_free (frontend_dev);
return FALSE;
}
if (ioctl (object->fd_frontend, FE_GET_INFO, &fe_info) < 0) {
GST_ELEMENT_ERROR (object, RESOURCE, SETTINGS,
(_("Could not get settings from frontend device \"%s\"."),
- object->frontend_dev), GST_ERROR_SYSTEM);
+ frontend_dev), GST_ERROR_SYSTEM);
- close (object->fd_dvr);
close (object->fd_frontend);
-
+ g_free (frontend_dev);
return FALSE;
}
@@ -693,27 +686,36 @@ gst_dvbsrc_open_frontend (GstDvbSrc * object)
0, object->adapter_type); */
GST_INFO_OBJECT (object, "DVB card: %s ", fe_info.name);
+ g_free (frontend_dev);
return TRUE;
}
static gboolean
gst_dvbsrc_open_dvr (GstDvbSrc * object)
{
+ gchar *dvr_dev;
+
+ dvr_dev = g_strdup_printf ("/dev/dvb/adapter%d/dvr%d",
+ object->adapter_number, object->frontend_number);
+ GST_INFO_OBJECT (object, "Using dvr device: %s", dvr_dev);
+
/* open DVR */
- if ((object->fd_dvr = open (object->dvr_dev, O_RDONLY | O_NONBLOCK)) < 0) {
+ if ((object->fd_dvr = open (dvr_dev, O_RDONLY | O_NONBLOCK)) < 0) {
switch (errno) {
case ENOENT:
GST_ELEMENT_ERROR (object, RESOURCE, NOT_FOUND,
- (_("Device \"%s\" does not exist."), object->dvr_dev), (NULL));
+ (_("Device \"%s\" does not exist."), dvr_dev), (NULL));
break;
default:
GST_ELEMENT_ERROR (object, RESOURCE, OPEN_READ,
- (_("Could not open file \"%s\" for reading."), object->dvr_dev),
+ (_("Could not open file \"%s\" for reading."), dvr_dev),
GST_ERROR_SYSTEM);
break;
}
+ g_free (dvr_dev);
return FALSE;
}
+ g_free (dvr_dev);
GST_INFO_OBJECT (object, "Setting buffer size");
if (ioctl (object->fd_dvr, DMX_SET_BUFFER_SIZE, 1024 * 1024) < 0) {
GST_INFO_OBJECT (object, "DMX_SET_BUFFER_SIZE failed");
@@ -732,9 +734,6 @@ gst_dvbsrc_finalize (GObject * _object)
g_return_if_fail (GST_IS_DVBSRC (_object));
object = GST_DVBSRC (_object);
- g_free (object->frontend_dev);
- g_free (object->demux_dev);
-
/* freeing the mutex segfaults somehow */
g_mutex_free (object->tune_mutex);
}
@@ -777,7 +776,7 @@ GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
static GstBuffer *
-read_device (int fd, const char *fd_name, int size)
+read_device (int fd, int adapter_number, int frontend_number, int size)
{
int count = 0;
struct pollfd pfd[1];
@@ -804,12 +803,14 @@ read_device (int fd, const char *fd_name, int size)
tmp = read (fd, GST_BUFFER_DATA (buf) + count, size - count);
if (tmp < 0) {
- GST_WARNING ("Unable to read from device: %s (%d)", fd_name, errno);
+ GST_WARNING
+ ("Unable to read from device: /dev/dvb/adapter%d/dvr%d (%d)",
+ adapter_number, frontend_number, errno);
attempts += 1;
if (attempts % 10 == 0) {
GST_WARNING
- ("Unable to read from device after %u attempts: %s",
- attempts, fd_name);
+ ("Unable to read from device after %u attempts: /dev/dvb/adapter%d/dvr%d",
+ attempts, adapter_number, frontend_number);
}
} else
@@ -819,11 +820,13 @@ read_device (int fd, const char *fd_name, int size)
}
} else if (ret_val == 0) { // poll timeout
attempts += 1;
- GST_INFO ("Reading from device %s timedout (%d)", fd_name, attempts);
+ GST_INFO ("Reading from device /dev/dvb/adapter%d/dvr%d timedout (%d)",
+ adapter_number, frontend_number, attempts);
if (attempts % 10 == 0) {
- GST_WARNING ("Unable to read after %u attempts from device: %s (%d)",
- attempts, fd_name, errno);
+ GST_WARNING
+ ("Unable to read after %u attempts from device: /dev/dvb/adapter%d/dvr%d (%d)",
+ attempts, adapter_number, frontend_number, errno);
}
} else if (errno == -EINTR) { // poll interrupted
;
@@ -857,7 +860,8 @@ gst_dvbsrc_create (GstPushSrc * element, GstBuffer ** buf)
if (object->fd_dvr > -1) {
/* --- Read TS from DVR device --- */
GST_DEBUG_OBJECT (object, "Reading from DVR device");
- *buf = read_device (object->fd_dvr, object->dvr_dev, buffer_size);
+ *buf = read_device (object->fd_dvr, object->adapter_number,
+ object->frontend_number, buffer_size);
if (*buf != NULL) {
GstCaps *caps;
@@ -1177,6 +1181,8 @@ gst_dvbsrc_set_pes_filters (GstDvbSrc * object)
int *fd;
int pid, i;
struct dmx_pes_filter_params pes_filter;
+ gchar *demux_dev = g_strdup_printf ("/dev/dvb/adapter%d/demux%d",
+ object->adapter_number, object->frontend_number);
GST_INFO_OBJECT (object, "Setting PES filter");
@@ -1188,10 +1194,10 @@ gst_dvbsrc_set_pes_filters (GstDvbSrc * object)
pid = object->pids[i];
close (*fd);
- if ((*fd = open (object->demux_dev, O_RDWR)) < 0)
- g_error ("Error opening demuxer: %s (%s)", strerror (errno),
- object->demux_dev);
-
+ if ((*fd = open (demux_dev, O_RDWR)) < 0) {
+ g_error ("Error opening demuxer: %s (%s)", strerror (errno), demux_dev);
+ g_free (demux_dev);
+ }
g_return_if_fail (*fd != -1);
pes_filter.pid = pid;
@@ -1205,7 +1211,7 @@ gst_dvbsrc_set_pes_filters (GstDvbSrc * object)
if (ioctl (*fd, DMX_SET_PES_FILTER, &pes_filter) < 0)
GST_WARNING_OBJECT (object, "Error setting PES filter on %s: %s",
- object->demux_dev, strerror (errno));
+ demux_dev, strerror (errno));
}
/* always have PAT in the filter if we haven't used all our filter slots */
if (object->pids[0] != 8192 && i < MAX_FILTERS) {
@@ -1218,18 +1224,18 @@ gst_dvbsrc_set_pes_filters (GstDvbSrc * object)
fd = &object->fd_filters[i];
close (*fd);
- if ((*fd = open (object->demux_dev, O_RDWR)) < 0) {
+ if ((*fd = open (demux_dev, O_RDWR)) < 0) {
GST_WARNING_OBJECT ("Error opening demuxer: %s (%s)",
- strerror (errno), object->demux_dev);
+ strerror (errno), demux_dev);
} else {
GST_INFO_OBJECT (object, "Setting pes-filter, pid = %d, type = %d",
pes_filter.pid, pes_filter.pes_type);
if (ioctl (*fd, DMX_SET_PES_FILTER, &pes_filter) < 0)
GST_WARNING_OBJECT (object, "Error setting PES filter on %s: %s",
- object->demux_dev, strerror (errno));
+ demux_dev, strerror (errno));
}
}
-
+ g_free (demux_dev);
}
diff --git a/sys/dvb/gstdvbsrc.h b/sys/dvb/gstdvbsrc.h
index e9756a67..46b301c1 100644
--- a/sys/dvb/gstdvbsrc.h
+++ b/sys/dvb/gstdvbsrc.h
@@ -52,10 +52,8 @@ G_BEGIN_DECLS
int adapter_type;
- char *device; /* the device directory with the sub-devices */
- char *frontend_dev;
- char *dvr_dev;
- char *demux_dev;
+ int adapter_number; /* the device directory with the sub-devices */
+ int frontend_number;
int fd_frontend;
int fd_dvr;