mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-04 21:42:25 +00:00
po/POTFILES.in: add dvbsrc
Original commit message from CVS: * po/POTFILES.in: add dvbsrc * sys/dvb/gstdvbsrc.c: (gst_dvbsrc_class_init), (gst_dvbsrc_init), (gst_dvbsrc_set_property), (gst_dvbsrc_get_property), (gst_dvbsrc_open_frontend), (gst_dvbsrc_open_dvr), (gst_dvbsrc_finalize), (read_device), (gst_dvbsrc_create), (gst_dvbsrc_start), (gst_dvbsrc_frontend_status), (gst_dvbsrc_tune), (gst_dvbsrc_unset_pes_filters), (gst_dvbsrc_set_pes_filter): * sys/dvb/gstdvbsrc.h: adapter-prefix is a terrible name for a device, so replace it. strerror should be used immediately after the syscall related to it. Actually throw a reasonable GST_ELEMENT_ERROR if we fail to open (pretty easy to trigger by opening the same device twice). Use _OBJECT macros where it makes sense. This element is going to need some work before it moves.
This commit is contained in:
parent
b261441c06
commit
de0a7a01a1
4 changed files with 113 additions and 78 deletions
19
ChangeLog
19
ChangeLog
|
@ -1,3 +1,22 @@
|
||||||
|
2006-11-04 Thomas Vander Stichele <thomas at apestaart dot org>
|
||||||
|
|
||||||
|
* po/POTFILES.in:
|
||||||
|
add dvbsrc
|
||||||
|
* sys/dvb/gstdvbsrc.c: (gst_dvbsrc_class_init), (gst_dvbsrc_init),
|
||||||
|
(gst_dvbsrc_set_property), (gst_dvbsrc_get_property),
|
||||||
|
(gst_dvbsrc_open_frontend), (gst_dvbsrc_open_dvr),
|
||||||
|
(gst_dvbsrc_finalize), (read_device), (gst_dvbsrc_create),
|
||||||
|
(gst_dvbsrc_start), (gst_dvbsrc_frontend_status),
|
||||||
|
(gst_dvbsrc_tune), (gst_dvbsrc_unset_pes_filters),
|
||||||
|
(gst_dvbsrc_set_pes_filter):
|
||||||
|
* sys/dvb/gstdvbsrc.h:
|
||||||
|
adapter-prefix is a terrible name for a device, so replace it.
|
||||||
|
strerror should be used immediately after the syscall related to it.
|
||||||
|
Actually throw a reasonable GST_ELEMENT_ERROR if we fail to open
|
||||||
|
(pretty easy to trigger by opening the same device twice).
|
||||||
|
Use _OBJECT macros where it makes sense.
|
||||||
|
This element is going to need some work before it moves.
|
||||||
|
|
||||||
2006-11-02 Tim-Philipp Müller <tim at centricular dot net>
|
2006-11-02 Tim-Philipp Müller <tim at centricular dot net>
|
||||||
|
|
||||||
Patch by: Sebastian Dröge <slomo at circular-chaos.org>
|
Patch by: Sebastian Dröge <slomo at circular-chaos.org>
|
||||||
|
|
|
@ -6,3 +6,4 @@
|
||||||
# sys/dxr3/dxr3videosink.c
|
# sys/dxr3/dxr3videosink.c
|
||||||
|
|
||||||
gst/qtdemux/qtdemux.c
|
gst/qtdemux/qtdemux.c
|
||||||
|
sys/dvb/gstdvbsrc.c
|
||||||
|
|
|
@ -40,6 +40,8 @@
|
||||||
#include <linux/dvb/frontend.h>
|
#include <linux/dvb/frontend.h>
|
||||||
#include <linux/dvb/dmx.h>
|
#include <linux/dvb/dmx.h>
|
||||||
|
|
||||||
|
#include "../../gst-libs/gst/gst-i18n-plugin.h"
|
||||||
|
|
||||||
GST_DEBUG_CATEGORY_STATIC (gstdvbsrc_debug);
|
GST_DEBUG_CATEGORY_STATIC (gstdvbsrc_debug);
|
||||||
#define GST_CAT_DEFAULT (gstdvbsrc_debug)
|
#define GST_CAT_DEFAULT (gstdvbsrc_debug)
|
||||||
|
|
||||||
|
@ -89,7 +91,7 @@ static GstElementDetails dvbsrc_details = {
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
ARG_0,
|
ARG_0,
|
||||||
ARG_DVBSRC_ADAPTER_PREFIX,
|
ARG_DVBSRC_DEVICE,
|
||||||
ARG_DVBSRC_DISEQC_SRC,
|
ARG_DVBSRC_DISEQC_SRC,
|
||||||
ARG_DVBSRC_FREQ,
|
ARG_DVBSRC_FREQ,
|
||||||
ARG_DVBSRC_POL,
|
ARG_DVBSRC_POL,
|
||||||
|
@ -257,7 +259,6 @@ gst_dvbsrc_inversion_get_type (void)
|
||||||
return dvbsrc_inversion_type;
|
return dvbsrc_inversion_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gst_dvbsrc_dispose (GObject * object);
|
|
||||||
static void gst_dvbsrc_finalize (GObject * object);
|
static void gst_dvbsrc_finalize (GObject * object);
|
||||||
static void gst_dvbsrc_set_property (GObject * object, guint prop_id,
|
static void gst_dvbsrc_set_property (GObject * object, guint prop_id,
|
||||||
const GValue * value, GParamSpec * pspec);
|
const GValue * value, GParamSpec * pspec);
|
||||||
|
@ -330,7 +331,6 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass)
|
||||||
|
|
||||||
gobject_class->set_property = gst_dvbsrc_set_property;
|
gobject_class->set_property = gst_dvbsrc_set_property;
|
||||||
gobject_class->get_property = gst_dvbsrc_get_property;
|
gobject_class->get_property = gst_dvbsrc_get_property;
|
||||||
gobject_class->dispose = gst_dvbsrc_dispose;
|
|
||||||
gobject_class->finalize = gst_dvbsrc_finalize;
|
gobject_class->finalize = gst_dvbsrc_finalize;
|
||||||
|
|
||||||
gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_dvbsrc_start);
|
gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_dvbsrc_start);
|
||||||
|
@ -341,11 +341,10 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass)
|
||||||
|
|
||||||
gstpushsrc_class->create = gst_dvbsrc_create;
|
gstpushsrc_class->create = gst_dvbsrc_create;
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class, ARG_DVBSRC_ADAPTER_PREFIX,
|
g_object_class_install_property (gobject_class, ARG_DVBSRC_DEVICE,
|
||||||
g_param_spec_string ("adapter-prefix",
|
g_param_spec_string ("device",
|
||||||
"adapter-prefix",
|
"device",
|
||||||
"The adapter prefix. e.g. /dev/dvb/adapter0",
|
"The device directory", "/dev/dvb/adapter0", G_PARAM_READWRITE));
|
||||||
"/dev/dvb/adapter0", G_PARAM_READWRITE));
|
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class, ARG_DVBSRC_FREQ,
|
g_object_class_install_property (gobject_class, ARG_DVBSRC_FREQ,
|
||||||
g_param_spec_int ("freq",
|
g_param_spec_int ("freq",
|
||||||
|
@ -439,7 +438,7 @@ gst_dvbsrc_init (GstDvbSrc * object, GstDvbSrcClass * klass)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
GST_INFO ("gst_dvbsrc_init");
|
GST_INFO_OBJECT (object, "gst_dvbsrc_init");
|
||||||
|
|
||||||
/* We are a live source */
|
/* We are a live source */
|
||||||
gst_base_src_set_live (GST_BASE_SRC (object), TRUE);
|
gst_base_src_set_live (GST_BASE_SRC (object), TRUE);
|
||||||
|
@ -455,11 +454,10 @@ gst_dvbsrc_init (GstDvbSrc * object, GstDvbSrcClass * klass)
|
||||||
object->pids[0] = 8192;
|
object->pids[0] = 8192;
|
||||||
|
|
||||||
/* Setting standard devices */
|
/* Setting standard devices */
|
||||||
object->adapter_prefix = g_strdup (DEFAULT_ADAPTER_PREFIX);
|
object->device = g_strdup (DEFAULT_DEVICE);
|
||||||
object->frontend_dev =
|
object->frontend_dev = g_strconcat (object->device, "/frontend0", NULL);
|
||||||
g_strconcat (object->adapter_prefix, "/frontend0", NULL);
|
object->demux_dev = g_strconcat (object->device, "/demux0", NULL);
|
||||||
object->demux_dev = g_strconcat (object->adapter_prefix, "/demux0", NULL);
|
object->dvr_dev = g_strconcat (object->device, "/dvr0", NULL);
|
||||||
object->dvr_dev = g_strconcat (object->adapter_prefix, "/dvr0", NULL);
|
|
||||||
|
|
||||||
object->sym_rate = DEFAULT_SYMBOL_RATE;
|
object->sym_rate = DEFAULT_SYMBOL_RATE;
|
||||||
object->diseqc_src = DEFAULT_DISEQC_SRC;
|
object->diseqc_src = DEFAULT_DISEQC_SRC;
|
||||||
|
@ -479,36 +477,35 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id,
|
||||||
object = GST_DVBSRC (_object);
|
object = GST_DVBSRC (_object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case ARG_DVBSRC_ADAPTER_PREFIX:
|
case ARG_DVBSRC_DEVICE:
|
||||||
{
|
{
|
||||||
char delim_str[] = "/\0";
|
char delim_str[] = "/\0";
|
||||||
|
|
||||||
if (object->adapter_prefix != NULL)
|
if (object->device != NULL)
|
||||||
g_free (object->adapter_prefix);
|
g_free (object->device);
|
||||||
object->adapter_prefix = g_value_dup_string (value);
|
object->device = g_value_dup_string (value);
|
||||||
|
|
||||||
if (g_str_has_suffix (object->adapter_prefix, "/"))
|
if (g_str_has_suffix (object->device, "/"))
|
||||||
delim_str[0] = '\0';
|
delim_str[0] = '\0';
|
||||||
|
|
||||||
object->frontend_dev =
|
object->frontend_dev =
|
||||||
g_strconcat (object->adapter_prefix, delim_str, "frontend0", NULL);
|
g_strconcat (object->device, delim_str, "frontend0", NULL);
|
||||||
object->demux_dev =
|
object->demux_dev =
|
||||||
g_strconcat (object->adapter_prefix, delim_str, "demux0", NULL);
|
g_strconcat (object->device, delim_str, "demux0", NULL);
|
||||||
object->dvr_dev =
|
object->dvr_dev = g_strconcat (object->device, delim_str, "dvr0", NULL);
|
||||||
g_strconcat (object->adapter_prefix, delim_str, "dvr0", NULL);
|
|
||||||
}
|
}
|
||||||
GST_INFO ("Set Property: ARG_DVBSRC_ADAPTER_PREFIX");
|
GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_DEVICE");
|
||||||
break;
|
break;
|
||||||
case ARG_DVBSRC_DISEQC_SRC:
|
case ARG_DVBSRC_DISEQC_SRC:
|
||||||
if (object->diseqc_src != g_value_get_int (value)) {
|
if (object->diseqc_src != g_value_get_int (value)) {
|
||||||
object->diseqc_src = g_value_get_int (value);
|
object->diseqc_src = g_value_get_int (value);
|
||||||
object->send_diseqc = TRUE;
|
object->send_diseqc = TRUE;
|
||||||
}
|
}
|
||||||
GST_INFO ("Set Property: ARG_DVBSRC_DISEQC_ID");
|
GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_DISEQC_ID");
|
||||||
break;
|
break;
|
||||||
case ARG_DVBSRC_FREQ:
|
case ARG_DVBSRC_FREQ:
|
||||||
object->freq = g_value_get_int (value);
|
object->freq = g_value_get_int (value);
|
||||||
GST_INFO ("Set Property: ARG_DVBSRC_FREQ");
|
GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_FREQ");
|
||||||
break;
|
break;
|
||||||
case ARG_DVBSRC_POL:
|
case ARG_DVBSRC_POL:
|
||||||
{
|
{
|
||||||
|
@ -518,7 +515,7 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id,
|
||||||
if (s != NULL)
|
if (s != NULL)
|
||||||
object->pol = (s[0] == 'h' || s[0] == 'H') ? DVB_POL_H : DVB_POL_V;
|
object->pol = (s[0] == 'h' || s[0] == 'H') ? DVB_POL_H : DVB_POL_V;
|
||||||
}
|
}
|
||||||
GST_INFO ("Set Property: ARG_DVBSRC_POL");
|
GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_POL");
|
||||||
break;
|
break;
|
||||||
case ARG_DVBSRC_PIDS:
|
case ARG_DVBSRC_PIDS:
|
||||||
{
|
{
|
||||||
|
@ -528,13 +525,13 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id,
|
||||||
gchar **pids;
|
gchar **pids;
|
||||||
char **tmp;
|
char **tmp;
|
||||||
|
|
||||||
GST_INFO ("Set Property: ARG_DVBSRC_PIDS");
|
GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_PIDS");
|
||||||
pid_string = g_value_dup_string (value);
|
pid_string = g_value_dup_string (value);
|
||||||
tmp = pids = g_strsplit (pid_string, ":", MAX_FILTERS);
|
tmp = pids = g_strsplit (pid_string, ":", MAX_FILTERS);
|
||||||
while (*pids != NULL && pid_count < MAX_FILTERS) {
|
while (*pids != NULL && pid_count < MAX_FILTERS) {
|
||||||
pid = strtol (*pids, NULL, 0);
|
pid = strtol (*pids, NULL, 0);
|
||||||
if (pid > 0 && pid <= 8192) {
|
if (pid > 0 && pid <= 8192) {
|
||||||
GST_INFO ("Parsed Pid: %d\n", pid);
|
GST_INFO_OBJECT (object, "Parsed Pid: %d\n", pid);
|
||||||
object->pids[pid_count] = pid;
|
object->pids[pid_count] = pid;
|
||||||
pid_count++;
|
pid_count++;
|
||||||
}
|
}
|
||||||
|
@ -545,7 +542,7 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id,
|
||||||
break;
|
break;
|
||||||
case ARG_DVBSRC_SYM_RATE:
|
case ARG_DVBSRC_SYM_RATE:
|
||||||
object->sym_rate = g_value_get_int (value);
|
object->sym_rate = g_value_get_int (value);
|
||||||
GST_INFO ("Set Property: ARG_DVBSRC_SYM_RATE to value %d",
|
GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_SYM_RATE to value %d",
|
||||||
g_value_get_int (value));
|
g_value_get_int (value));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -574,7 +571,7 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id,
|
||||||
object->inversion = g_value_get_enum (value);
|
object->inversion = g_value_get_enum (value);
|
||||||
break;
|
break;
|
||||||
case ARG_DVBSRC_TUNE:
|
case ARG_DVBSRC_TUNE:
|
||||||
GST_INFO ("Set Property: ARG_DVBSRC_TUNE");
|
GST_INFO_OBJECT (object, "Set Property: ARG_DVBSRC_TUNE");
|
||||||
/* if we are in paused/playing state tune now, otherwise in ready to paused state change */
|
/* if we are in paused/playing state tune now, otherwise in ready to paused state change */
|
||||||
if (gst_element_get_state
|
if (gst_element_get_state
|
||||||
(GST_ELEMENT (object), NULL, NULL,
|
(GST_ELEMENT (object), NULL, NULL,
|
||||||
|
@ -601,8 +598,8 @@ gst_dvbsrc_get_property (GObject * _object, guint prop_id,
|
||||||
object = GST_DVBSRC (_object);
|
object = GST_DVBSRC (_object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case ARG_DVBSRC_ADAPTER_PREFIX:
|
case ARG_DVBSRC_DEVICE:
|
||||||
g_value_set_string (value, object->adapter_prefix);
|
g_value_set_string (value, object->device);
|
||||||
break;
|
break;
|
||||||
case ARG_DVBSRC_FREQ:
|
case ARG_DVBSRC_FREQ:
|
||||||
g_value_set_int (value, object->freq);
|
g_value_set_int (value, object->freq);
|
||||||
|
@ -643,22 +640,36 @@ gst_dvbsrc_open_frontend (GstDvbSrc * object)
|
||||||
struct dvb_frontend_info fe_info;
|
struct dvb_frontend_info fe_info;
|
||||||
char *adapter_desc = NULL;
|
char *adapter_desc = NULL;
|
||||||
|
|
||||||
GST_INFO ("Using frontend: %s", object->frontend_dev);
|
GST_INFO_OBJECT (object, "Using frontend device: %s", object->frontend_dev);
|
||||||
GST_INFO ("Using dvr: %s", object->dvr_dev);
|
GST_INFO_OBJECT (object, "Using dvr device: %s", object->dvr_dev);
|
||||||
|
|
||||||
/* open frontend */
|
/* open frontend */
|
||||||
if ((object->fd_frontend = open (object->frontend_dev, O_RDWR)) < 0) {
|
if ((object->fd_frontend = open (object->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));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
GST_ELEMENT_ERROR (object, RESOURCE, OPEN_READ_WRITE,
|
||||||
|
(_("Could not open frontend device \"%s\"."), object->frontend_dev),
|
||||||
|
GST_ERROR_SYSTEM);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
close (object->fd_dvr);
|
close (object->fd_dvr);
|
||||||
g_warning ("Could not open frontend: %s, %s", object->frontend_dev,
|
|
||||||
strerror (errno));
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ioctl (object->fd_frontend, FE_GET_INFO, &fe_info) < 0) {
|
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);
|
||||||
|
|
||||||
close (object->fd_dvr);
|
close (object->fd_dvr);
|
||||||
close (object->fd_frontend);
|
close (object->fd_frontend);
|
||||||
|
|
||||||
g_warning ("Unable to get frontend info: %s", strerror (errno));
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -680,7 +691,7 @@ gst_dvbsrc_open_frontend (GstDvbSrc * object)
|
||||||
/*g_signal_emit (G_OBJECT (object), gst_dvbsrc_signals[ADAPTER_TYPE_SIGNAL],
|
/*g_signal_emit (G_OBJECT (object), gst_dvbsrc_signals[ADAPTER_TYPE_SIGNAL],
|
||||||
0, object->adapter_type); */
|
0, object->adapter_type); */
|
||||||
|
|
||||||
GST_INFO ("DVB card: %s ", fe_info.name);
|
GST_INFO_OBJECT (object, "DVB card: %s ", fe_info.name);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -689,34 +700,33 @@ gst_dvbsrc_open_dvr (GstDvbSrc * object)
|
||||||
{
|
{
|
||||||
/* open DVR */
|
/* open DVR */
|
||||||
if ((object->fd_dvr = open (object->dvr_dev, O_RDONLY | O_NONBLOCK)) < 0) {
|
if ((object->fd_dvr = open (object->dvr_dev, O_RDONLY | O_NONBLOCK)) < 0) {
|
||||||
g_warning ("Could not open dvr device: %s", object->dvr_dev);
|
switch (errno) {
|
||||||
|
case ENOENT:
|
||||||
|
GST_ELEMENT_ERROR (object, RESOURCE, NOT_FOUND,
|
||||||
|
(_("Device \"%s\" does not exist."), object->dvr_dev), (NULL));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
GST_ELEMENT_ERROR (object, RESOURCE, OPEN_READ,
|
||||||
|
(_("Could not open file \"%s\" for reading."), object->dvr_dev),
|
||||||
|
GST_ERROR_SYSTEM);
|
||||||
|
break;
|
||||||
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
GST_INFO ("Setting buffer size");
|
GST_INFO_OBJECT (object, "Setting buffer size");
|
||||||
if (ioctl (object->fd_dvr, DMX_SET_BUFFER_SIZE, 1024 * 1024) < 0) {
|
if (ioctl (object->fd_dvr, DMX_SET_BUFFER_SIZE, 1024 * 1024) < 0) {
|
||||||
GST_INFO ("DMX_SET_BUFFER_SIZE failed");
|
GST_INFO_OBJECT (object, "DMX_SET_BUFFER_SIZE failed");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
gst_dvbsrc_dispose (GObject * _object)
|
|
||||||
{
|
|
||||||
GstDvbSrc *object;
|
|
||||||
|
|
||||||
GST_DEBUG ("gst_dvbsrc_dispose");
|
|
||||||
|
|
||||||
g_return_if_fail (GST_IS_DVBSRC (_object));
|
|
||||||
object = GST_DVBSRC (_object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_dvbsrc_finalize (GObject * _object)
|
gst_dvbsrc_finalize (GObject * _object)
|
||||||
{
|
{
|
||||||
GstDvbSrc *object;
|
GstDvbSrc *object;
|
||||||
|
|
||||||
GST_DEBUG ("gst_dvbsrc_finalize");
|
GST_DEBUG_OBJECT (_object, "gst_dvbsrc_finalize");
|
||||||
|
|
||||||
g_return_if_fail (GST_IS_DVBSRC (_object));
|
g_return_if_fail (GST_IS_DVBSRC (_object));
|
||||||
object = GST_DVBSRC (_object);
|
object = GST_DVBSRC (_object);
|
||||||
|
@ -754,9 +764,11 @@ plugin_init (GstPlugin * plugin)
|
||||||
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
|
||||||
GST_VERSION_MINOR,
|
GST_VERSION_MINOR,
|
||||||
"dvbsrc",
|
"dvbsrc",
|
||||||
"DVB Source", plugin_init, VERSION, "LGPL", "", "University of Paderborn")
|
"DVB Source", plugin_init, VERSION, "LGPL", "", "University of Paderborn");
|
||||||
|
|
||||||
static GstBuffer *read_device (int fd, const char *fd_name, int size)
|
|
||||||
|
static GstBuffer *
|
||||||
|
read_device (int fd, const char *fd_name, int size)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
struct pollfd pfd[1];
|
struct pollfd pfd[1];
|
||||||
|
@ -845,7 +857,7 @@ gst_dvbsrc_create (GstPushSrc * element, GstBuffer ** buf)
|
||||||
|
|
||||||
if (object->fd_dvr > -1) {
|
if (object->fd_dvr > -1) {
|
||||||
/* --- Read TS from DVR device --- */
|
/* --- Read TS from DVR device --- */
|
||||||
GST_DEBUG ("Reading 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->dvr_dev, buffer_size);
|
||||||
if (*buf != NULL) {
|
if (*buf != NULL) {
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
|
@ -864,7 +876,7 @@ gst_dvbsrc_create (GstPushSrc * element, GstBuffer ** buf)
|
||||||
quality_signal_rate++;
|
quality_signal_rate++;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG ("Failed to read from device");
|
GST_DEBUG_OBJECT (object, "Failed to read from device");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -884,7 +896,7 @@ gst_dvbsrc_start (GstBaseSrc * bsrc)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (!gst_dvbsrc_open_dvr (src)) {
|
if (!gst_dvbsrc_open_dvr (src)) {
|
||||||
GST_ERROR ("\nNot able to open dvr_device");
|
GST_ERROR_OBJECT (src, "Not able to open dvr_device");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -948,19 +960,20 @@ gst_dvbsrc_frontend_status (GstDvbSrc * object)
|
||||||
fe_status_t status = 0;
|
fe_status_t status = 0;
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
GST_INFO ("gst_dvbsrc_frontend_status\n");
|
GST_INFO_OBJECT (object, "gst_dvbsrc_frontend_status\n");
|
||||||
|
|
||||||
if (object->fd_frontend < 0) {
|
if (object->fd_frontend < 0) {
|
||||||
GST_ERROR ("Trying to get frontend status from not opened device!");
|
GST_ERROR_OBJECT (object,
|
||||||
|
"Trying to get frontend status from not opened device!");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else
|
} else
|
||||||
GST_INFO ("fd-frontend: %d", object->fd_frontend);
|
GST_INFO_OBJECT (object, "fd-frontend: %d", object->fd_frontend);
|
||||||
|
|
||||||
for (i = 0; i < 15; i++) {
|
for (i = 0; i < 15; i++) {
|
||||||
usleep (1000000);
|
usleep (1000000);
|
||||||
GST_INFO (".");
|
GST_INFO_OBJECT (object, ".");
|
||||||
if (ioctl (object->fd_frontend, FE_READ_STATUS, &status) == -1) {
|
if (ioctl (object->fd_frontend, FE_READ_STATUS, &status) == -1) {
|
||||||
GST_ERROR ("Failed reading frontend status.");
|
GST_ERROR_OBJECT (object, "Failed reading frontend status.");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
gst_dvbsrc_output_frontend_stats (object);
|
gst_dvbsrc_output_frontend_stats (object);
|
||||||
|
@ -970,7 +983,8 @@ gst_dvbsrc_frontend_status (GstDvbSrc * object)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(status & FE_HAS_LOCK)) {
|
if (!(status & FE_HAS_LOCK)) {
|
||||||
GST_INFO ("Not able to lock to the signal on the given frequency.\n");
|
GST_INFO_OBJECT (object,
|
||||||
|
"Not able to lock to the signal on the given frequency.\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
} else
|
} else
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
@ -1047,11 +1061,11 @@ gst_dvbsrc_tune (GstDvbSrc * object)
|
||||||
* - then tell the MPEG decoder to start
|
* - then tell the MPEG decoder to start
|
||||||
* - before tuning: first stop the MPEG decoder, then stop all filters
|
* - before tuning: first stop the MPEG decoder, then stop all filters
|
||||||
*/
|
*/
|
||||||
GST_INFO ("gst_dvbsrc_tune");
|
GST_INFO_OBJECT (object, "gst_dvbsrc_tune");
|
||||||
|
|
||||||
if (object->fd_frontend < 0) {
|
if (object->fd_frontend < 0) {
|
||||||
/* frontend not opened yet, tune later */
|
/* frontend not opened yet, tune later */
|
||||||
GST_INFO ("Frontend not open: tuning later");
|
GST_INFO_OBJECT (object, "Frontend not open: tuning later");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1077,7 +1091,8 @@ gst_dvbsrc_tune (GstDvbSrc * object)
|
||||||
feparams.frequency = freq;
|
feparams.frequency = freq;
|
||||||
object->tone = SEC_TONE_OFF;
|
object->tone = SEC_TONE_OFF;
|
||||||
}
|
}
|
||||||
GST_INFO ("tuning DVB-S to L-Band:%u, Pol:%d, srate=%u, 22kHz=%s",
|
GST_INFO_OBJECT (object,
|
||||||
|
"tuning DVB-S to L-Band:%u, Pol:%d, srate=%u, 22kHz=%s",
|
||||||
feparams.frequency, object->pol, sym_rate,
|
feparams.frequency, object->pol, sym_rate,
|
||||||
object->tone == SEC_TONE_ON ? "on" : "off");
|
object->tone == SEC_TONE_ON ? "on" : "off");
|
||||||
|
|
||||||
|
@ -1099,7 +1114,7 @@ gst_dvbsrc_tune (GstDvbSrc * object)
|
||||||
g_warning ("Error setting tone: %s", strerror (errno));
|
g_warning ("Error setting tone: %s", strerror (errno));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
GST_DEBUG ("Sending DISEqC");
|
GST_DEBUG_OBJECT (object, "Sending DISEqC");
|
||||||
diseqc (object->fd_frontend, object->diseqc_src, voltage, object->tone);
|
diseqc (object->fd_frontend, object->diseqc_src, voltage, object->tone);
|
||||||
/* Once diseqc source is set, do not set it again until
|
/* Once diseqc source is set, do not set it again until
|
||||||
* app decides to change it */
|
* app decides to change it */
|
||||||
|
@ -1118,10 +1133,10 @@ gst_dvbsrc_tune (GstDvbSrc * object)
|
||||||
feparams.u.ofdm.hierarchy_information = object->hierarchy_information;
|
feparams.u.ofdm.hierarchy_information = object->hierarchy_information;
|
||||||
feparams.inversion = object->inversion;
|
feparams.inversion = object->inversion;
|
||||||
|
|
||||||
GST_INFO ("tuning DVB-T to %d Hz\n", freq);
|
GST_INFO_OBJECT (object, "tuning DVB-T to %d Hz\n", freq);
|
||||||
break;
|
break;
|
||||||
case FE_QAM:
|
case FE_QAM:
|
||||||
GST_INFO ("Tuning DVB-C to %d, srate=%d", freq, sym_rate);
|
GST_INFO_OBJECT (object, "Tuning DVB-C to %d, srate=%d", freq, sym_rate);
|
||||||
feparams.frequency = freq;
|
feparams.frequency = freq;
|
||||||
feparams.inversion = INVERSION_OFF;
|
feparams.inversion = INVERSION_OFF;
|
||||||
feparams.u.qam.fec_inner = FEC_AUTO;
|
feparams.u.qam.fec_inner = FEC_AUTO;
|
||||||
|
@ -1151,7 +1166,7 @@ gst_dvbsrc_unset_pes_filters (GstDvbSrc * object)
|
||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
GST_INFO ("clearing PES filter");
|
GST_INFO_OBJECT (object, "clearing PES filter");
|
||||||
|
|
||||||
for (i = 0; i < MAX_FILTERS; i++) {
|
for (i = 0; i < MAX_FILTERS; i++) {
|
||||||
if (object->fd_filters[i] == -1)
|
if (object->fd_filters[i] == -1)
|
||||||
|
@ -1168,7 +1183,7 @@ gst_dvbsrc_set_pes_filter (GstDvbSrc * object)
|
||||||
int pid, i;
|
int pid, i;
|
||||||
struct dmx_pes_filter_params pes_filter;
|
struct dmx_pes_filter_params pes_filter;
|
||||||
|
|
||||||
GST_INFO ("Setting PES filter");
|
GST_INFO_OBJECT (object, "Setting PES filter");
|
||||||
|
|
||||||
for (i = 0; i < MAX_FILTERS; i++) {
|
for (i = 0; i < MAX_FILTERS; i++) {
|
||||||
if (object->pids[i] == 0)
|
if (object->pids[i] == 0)
|
||||||
|
@ -1190,8 +1205,8 @@ gst_dvbsrc_set_pes_filter (GstDvbSrc * object)
|
||||||
pes_filter.pes_type = DMX_PES_OTHER;
|
pes_filter.pes_type = DMX_PES_OTHER;
|
||||||
pes_filter.flags = DMX_IMMEDIATE_START;
|
pes_filter.flags = DMX_IMMEDIATE_START;
|
||||||
|
|
||||||
GST_INFO ("Setting pes-filter, pid = %d, type = %d", pes_filter.pid,
|
GST_INFO_OBJECT (object, "Setting pes-filter, pid = %d, type = %d",
|
||||||
pes_filter.pes_type);
|
pes_filter.pid, pes_filter.pes_type);
|
||||||
|
|
||||||
if (ioctl (*fd, DMX_SET_PES_FILTER, &pes_filter) < 0)
|
if (ioctl (*fd, DMX_SET_PES_FILTER, &pes_filter) < 0)
|
||||||
g_warning ("Error setting PES filter on %s: %s", object->demux_dev,
|
g_warning ("Error setting PES filter on %s: %s", object->demux_dev,
|
||||||
|
|
|
@ -22,9 +22,9 @@ extern "C"
|
||||||
#define IPACKS 2048
|
#define IPACKS 2048
|
||||||
#define TS_SIZE 188
|
#define TS_SIZE 188
|
||||||
#define IN_SIZE TS_SIZE*10
|
#define IN_SIZE TS_SIZE*10
|
||||||
#define MAX_ATTEMPTS 10 // limit timeouts for poll
|
#define MAX_ATTEMPTS 10 /* limit timeouts for poll */
|
||||||
|
|
||||||
#define DEFAULT_ADAPTER_PREFIX "/dev/dvb/adapter0"
|
#define DEFAULT_DEVICE "/dev/dvb/adapter0"
|
||||||
#define DEFAULT_SYMBOL_RATE 0
|
#define DEFAULT_SYMBOL_RATE 0
|
||||||
#define DEFAULT_BUFFER_SIZE 8192
|
#define DEFAULT_BUFFER_SIZE 8192
|
||||||
#define DEFAULT_DISEQC_SRC -1 /* disabled */
|
#define DEFAULT_DISEQC_SRC -1 /* disabled */
|
||||||
|
@ -57,7 +57,7 @@ extern "C"
|
||||||
|
|
||||||
int adapter_type;
|
int adapter_type;
|
||||||
|
|
||||||
char *adapter_prefix;
|
char *device; /* the device directory with the sub-devices */
|
||||||
char *frontend_dev;
|
char *frontend_dev;
|
||||||
char *dvr_dev;
|
char *dvr_dev;
|
||||||
char *demux_dev;
|
char *demux_dev;
|
||||||
|
|
Loading…
Reference in a new issue