dvbsrc + dvb api buffer property to overcome buffer under reads
authorFabrizio (Misto) Milo <mistobaan@gmail.com>
Tue, 1 Feb 2011 19:39:16 +0000 (11:39 -0800)
committerEdward Hervey <edward.hervey@collabora.co.uk>
Tue, 14 Aug 2012 17:05:32 +0000 (19:05 +0200)
sys/dvb/gstdvbsrc.c
sys/dvb/gstdvbsrc.h

index 3a83a40..251773a 100644 (file)
@@ -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;
index e290f4d..adf6c0e 100644 (file)
@@ -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);
 
-G_END_DECLS
+GType gst_dvbsrc_get_type (void);
+gboolean gst_dvbsrc_plugin_init (GstPlugin * plugin);
 
-#endif                          /* __GST_DVBSRC_H__ */
+G_END_DECLS
+#endif /* __GST_DVBSRC_H__ */