dvbsrc + dvb api buffer property to overcome buffer under reads

This commit is contained in:
Fabrizio (Misto) Milo 2011-02-01 11:39:16 -08:00 committed by Edward Hervey
parent c4ccca8795
commit fe5cf525e1
2 changed files with 75 additions and 57 deletions

View file

@ -90,6 +90,7 @@ enum
ARG_DVBSRC_INVERSION, ARG_DVBSRC_INVERSION,
ARG_DVBSRC_STATS_REPORTING_INTERVAL, ARG_DVBSRC_STATS_REPORTING_INTERVAL,
ARG_DVBSRC_TIMEOUT, ARG_DVBSRC_TIMEOUT,
ARG_DVBSRC_DVB_BUFFER_SIZE
}; };
#define DEFAULT_ADAPTER 0 #define DEFAULT_ADAPTER 0
@ -109,7 +110,7 @@ enum
#define DEFAULT_INVERSION INVERSION_ON #define DEFAULT_INVERSION INVERSION_ON
#define DEFAULT_STATS_REPORTING_INTERVAL 100 #define DEFAULT_STATS_REPORTING_INTERVAL 100
#define DEFAULT_TIMEOUT 1000000 /* 1 second */ #define DEFAULT_TIMEOUT 1000000 /* 1 second */
#define DEFAULT_DVB_BUFFER_SIZE (10*188*1024) /* Default is the same as the kernel default */
#define DEFAULT_BUFFER_SIZE 8192 /* not a property */ #define DEFAULT_BUFFER_SIZE 8192 /* not a property */
static void gst_dvbsrc_output_frontend_stats (GstDvbSrc * src); static void gst_dvbsrc_output_frontend_stats (GstDvbSrc * src);
@ -447,6 +448,13 @@ gst_dvbsrc_class_init (GstDvbSrcClass * klass)
g_param_spec_uint64 ("timeout", "Timeout", g_param_spec_uint64 ("timeout", "Timeout",
"Post a message after timeout microseconds (0 = disabled)", 0, "Post a message after timeout microseconds (0 = disabled)", 0,
G_MAXUINT64, DEFAULT_TIMEOUT, G_PARAM_READWRITE)); G_MAXUINT64, DEFAULT_TIMEOUT, G_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
ARG_DVBSRC_DVB_BUFFER_SIZE,
g_param_spec_uint ("dvb-buffer-size",
"dvb-buffer-size",
"The kernel buffer size used by the DVB api",
0, G_MAXUINT, DEFAULT_DVB_BUFFER_SIZE, G_PARAM_READWRITE));
} }
/* initialize the new element /* initialize the new element
@ -475,7 +483,7 @@ gst_dvbsrc_init (GstDvbSrc * object)
} }
/* Pid 8192 on DVB gets the whole transport stream */ /* Pid 8192 on DVB gets the whole transport stream */
object->pids[0] = 8192; object->pids[0] = 8192;
object->dvb_buffer_size = DEFAULT_DVB_BUFFER_SIZE;
object->adapter_number = DEFAULT_ADAPTER; object->adapter_number = DEFAULT_ADAPTER;
object->frontend_number = DEFAULT_FRONTEND; object->frontend_number = DEFAULT_FRONTEND;
object->diseqc_src = DEFAULT_DISEQC_SRC; object->diseqc_src = DEFAULT_DISEQC_SRC;
@ -638,6 +646,9 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id,
case ARG_DVBSRC_TIMEOUT: case ARG_DVBSRC_TIMEOUT:
object->timeout = g_value_get_uint64 (value); object->timeout = g_value_get_uint64 (value);
break; break;
case ARG_DVBSRC_DVB_BUFFER_SIZE:
object->dvb_buffer_size = g_value_get_uint (value);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
} }
@ -704,6 +715,9 @@ gst_dvbsrc_get_property (GObject * _object, guint prop_id,
case ARG_DVBSRC_TIMEOUT: case ARG_DVBSRC_TIMEOUT:
g_value_set_uint64 (value, object->timeout); g_value_set_uint64 (value, object->timeout);
break; break;
case ARG_DVBSRC_DVB_BUFFER_SIZE:
g_value_set_uint (value, object->dvb_buffer_size);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
} }
@ -850,9 +864,11 @@ gst_dvbsrc_open_dvr (GstDvbSrc * object)
return FALSE; return FALSE;
} }
g_free (dvr_dev); 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, "Setting DVB kernel buffer size to %d ",
GST_INFO_OBJECT (object, "DMX_SET_BUFFER_SIZE failed"); object->dvb_buffer_size);
if (ioctl (object->fd_dvr, DMX_SET_BUFFER_SIZE, object->dvb_buffer_size) < 0) {
GST_INFO_OBJECT (object, "ioctl DMX_SET_BUFFER_SIZE failed (%d)", errno);
return FALSE; return FALSE;
} }
return TRUE; return TRUE;

View file

@ -8,11 +8,11 @@
G_BEGIN_DECLS G_BEGIN_DECLS
typedef enum typedef enum
{ {
DVB_POL_H, DVB_POL_H,
DVB_POL_V, DVB_POL_V,
DVB_POL_ZERO DVB_POL_ZERO
} GstDvbSrcPol; } GstDvbSrcPol;
#define IPACKS 2048 #define IPACKS 2048
@ -32,12 +32,12 @@ G_BEGIN_DECLS
#define GST_IS_DVBSRC_CLASS(klass) \ #define GST_IS_DVBSRC_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DVBSRC)) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DVBSRC))
typedef struct _GstDvbSrc GstDvbSrc; typedef struct _GstDvbSrc GstDvbSrc;
typedef struct _GstDvbSrcClass GstDvbSrcClass; typedef struct _GstDvbSrcClass GstDvbSrcClass;
typedef struct _GstDvbSrcParam GstDvbSrcParam; typedef struct _GstDvbSrcParam GstDvbSrcParam;
struct _GstDvbSrc struct _GstDvbSrc
{ {
GstPushSrc element; GstPushSrc element;
GstPad *srcpad; GstPad *srcpad;
@ -75,20 +75,22 @@ G_BEGIN_DECLS
GstDvbSrcPol pol; GstDvbSrcPol pol;
guint stats_interval; guint stats_interval;
guint stats_counter; guint stats_counter;
}; gboolean need_unlock;
struct _GstDvbSrcClass guint dvb_buffer_size;
{ };
struct _GstDvbSrcClass
{
GstPushSrcClass parent_class; GstPushSrcClass parent_class;
void (*adapter_type) (GstElement * element, gint type); void (*adapter_type) (GstElement * element, gint type);
void (*signal_quality) (GstElement * element, gint strength, gint snr); void (*signal_quality) (GstElement * element, gint strength, gint snr);
}; };
GType gst_dvbsrc_get_type (void); GType gst_dvbsrc_get_type (void);
gboolean gst_dvbsrc_plugin_init (GstPlugin *plugin); gboolean gst_dvbsrc_plugin_init (GstPlugin * plugin);
G_END_DECLS G_END_DECLS
#endif /* __GST_DVBSRC_H__ */ #endif /* __GST_DVBSRC_H__ */