From fe5cf525e1de8320d1db679145ac7e2d48e7767a Mon Sep 17 00:00:00 2001 From: "Fabrizio (Misto) Milo" Date: Tue, 1 Feb 2011 11:39:16 -0800 Subject: [PATCH] dvbsrc + dvb api buffer property to overcome buffer under reads --- sys/dvb/gstdvbsrc.c | 26 ++++++++--- sys/dvb/gstdvbsrc.h | 106 ++++++++++++++++++++++---------------------- 2 files changed, 75 insertions(+), 57 deletions(-) diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c index 3a83a40d58..251773a1f1 100644 --- a/sys/dvb/gstdvbsrc.c +++ b/sys/dvb/gstdvbsrc.c @@ -90,6 +90,7 @@ enum ARG_DVBSRC_INVERSION, ARG_DVBSRC_STATS_REPORTING_INTERVAL, ARG_DVBSRC_TIMEOUT, + ARG_DVBSRC_DVB_BUFFER_SIZE }; #define DEFAULT_ADAPTER 0 @@ -109,7 +110,7 @@ enum #define DEFAULT_INVERSION INVERSION_ON #define DEFAULT_STATS_REPORTING_INTERVAL 100 #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 */ 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", "Post a message after timeout microseconds (0 = disabled)", 0, 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 @@ -475,7 +483,7 @@ gst_dvbsrc_init (GstDvbSrc * object) } /* Pid 8192 on DVB gets the whole transport stream */ object->pids[0] = 8192; - + object->dvb_buffer_size = DEFAULT_DVB_BUFFER_SIZE; object->adapter_number = DEFAULT_ADAPTER; object->frontend_number = DEFAULT_FRONTEND; object->diseqc_src = DEFAULT_DISEQC_SRC; @@ -638,6 +646,9 @@ gst_dvbsrc_set_property (GObject * _object, guint prop_id, case ARG_DVBSRC_TIMEOUT: object->timeout = g_value_get_uint64 (value); break; + case ARG_DVBSRC_DVB_BUFFER_SIZE: + object->dvb_buffer_size = g_value_get_uint (value); + break; default: 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: g_value_set_uint64 (value, object->timeout); break; + case ARG_DVBSRC_DVB_BUFFER_SIZE: + g_value_set_uint (value, object->dvb_buffer_size); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); } @@ -850,9 +864,11 @@ gst_dvbsrc_open_dvr (GstDvbSrc * object) 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"); + + GST_INFO_OBJECT (object, "Setting DVB kernel buffer size to %d ", + 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 TRUE; diff --git a/sys/dvb/gstdvbsrc.h b/sys/dvb/gstdvbsrc.h index e290f4d6b9..adf6c0ed71 100644 --- a/sys/dvb/gstdvbsrc.h +++ b/sys/dvb/gstdvbsrc.h @@ -7,12 +7,12 @@ G_BEGIN_DECLS - typedef enum - { - DVB_POL_H, - DVB_POL_V, - DVB_POL_ZERO - } GstDvbSrcPol; + typedef enum +{ + DVB_POL_H, + DVB_POL_V, + DVB_POL_ZERO +} GstDvbSrcPol; #define IPACKS 2048 @@ -32,63 +32,65 @@ G_BEGIN_DECLS #define GST_IS_DVBSRC_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DVBSRC)) - typedef struct _GstDvbSrc GstDvbSrc; - typedef struct _GstDvbSrcClass GstDvbSrcClass; - typedef struct _GstDvbSrcParam GstDvbSrcParam; +typedef struct _GstDvbSrc GstDvbSrc; +typedef struct _GstDvbSrcClass GstDvbSrcClass; +typedef struct _GstDvbSrcParam GstDvbSrcParam; - struct _GstDvbSrc - { - GstPushSrc element; - GstPad *srcpad; +struct _GstDvbSrc +{ + GstPushSrc element; + GstPad *srcpad; - GMutex tune_mutex; - gboolean need_tune; + GMutex tune_mutex; + gboolean need_tune; - int adapter_type; + int adapter_type; - int adapter_number; /* the device directory with the sub-devices */ - int frontend_number; + int adapter_number; /* the device directory with the sub-devices */ + int frontend_number; - int fd_frontend; - int fd_dvr; - int fd_filters[MAX_FILTERS]; - GstPoll *poll; - GstPollFD poll_fd_dvr; + int fd_frontend; + int fd_dvr; + int fd_filters[MAX_FILTERS]; + GstPoll *poll; + GstPollFD poll_fd_dvr; - guint16 pids[MAX_FILTERS]; - unsigned int freq; - unsigned int sym_rate; - int tone; - int diseqc_src; - gboolean send_diseqc; + guint16 pids[MAX_FILTERS]; + unsigned int freq; + unsigned int sym_rate; + int tone; + int diseqc_src; + gboolean send_diseqc; - int bandwidth; - int code_rate_hp; - int code_rate_lp; - int modulation; - int guard_interval; - int transmission_mode; - int hierarchy_information; - int inversion; - guint64 timeout; + int bandwidth; + int code_rate_hp; + int code_rate_lp; + int modulation; + int guard_interval; + int transmission_mode; + int hierarchy_information; + int inversion; + guint64 timeout; - GstDvbSrcPol pol; - guint stats_interval; - guint stats_counter; - }; + GstDvbSrcPol pol; + guint stats_interval; + guint stats_counter; + gboolean need_unlock; - struct _GstDvbSrcClass - { - GstPushSrcClass parent_class; + guint dvb_buffer_size; +}; - void (*adapter_type) (GstElement * element, gint type); - void (*signal_quality) (GstElement * element, gint strength, gint snr); - }; +struct _GstDvbSrcClass +{ + GstPushSrcClass parent_class; + + void (*adapter_type) (GstElement * element, gint type); + void (*signal_quality) (GstElement * element, gint strength, gint snr); +}; - GType gst_dvbsrc_get_type (void); - gboolean gst_dvbsrc_plugin_init (GstPlugin *plugin); +GType gst_dvbsrc_get_type (void); +gboolean gst_dvbsrc_plugin_init (GstPlugin * plugin); G_END_DECLS - -#endif /* __GST_DVBSRC_H__ */ +#endif /* __GST_DVBSRC_H__ */