summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2012-04-20 15:05:36 +0200
committerWim Taymans <wim.taymans@collabora.co.uk>2012-04-20 15:17:56 +0200
commita8af5334eb8cad352b0ffa7901a0222082e9227b (patch)
tree8cedeabb4e0bcd8c1d0954c92478c93a3549e1a6
parent06b62e00ae075d07f6a0f669e2db63d2e6362e61 (diff)
dvbsrc: pass the reason for failed read as GstFlowReturn
Make the _read_device function return a GstFlowReturn so that we can propagate this to the caller. This allows us to differentiate between poll errors and flushing state. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=674219
-rw-r--r--sys/dvb/gstdvbsrc.c40
1 files changed, 21 insertions, 19 deletions
diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c
index c13f33639..3fd7963ad 100644
--- a/sys/dvb/gstdvbsrc.c
+++ b/sys/dvb/gstdvbsrc.c
@@ -897,8 +897,8 @@ gst_dvbsrc_plugin_init (GstPlugin * plugin)
GST_TYPE_DVBSRC);
}
-static GstBuffer *
-gst_dvbsrc_read_device (GstDvbSrc * object, int size)
+static GstFlowReturn
+gst_dvbsrc_read_device (GstDvbSrc * object, int size, GstBuffer ** buffer)
{
gint count = 0;
gint ret_val = 0;
@@ -906,10 +906,10 @@ gst_dvbsrc_read_device (GstDvbSrc * object, int size)
GstClockTime timeout = object->timeout * GST_USECOND;
GstMapInfo map;
- g_return_val_if_fail (GST_IS_BUFFER (buf), NULL);
+ g_return_val_if_fail (GST_IS_BUFFER (buf), GST_FLOW_ERROR);
if (object->fd_dvr < 0)
- return NULL;
+ return GST_FLOW_ERROR;
gst_buffer_map (buf, &map, GST_MAP_WRITE);
while (count < size) {
@@ -943,20 +943,25 @@ gst_dvbsrc_read_device (GstDvbSrc * object, int size)
gst_buffer_unmap (buf, &map);
gst_buffer_resize (buf, 0, count);
- return buf;
+ *buffer = buf;
-stopped:
- GST_DEBUG_OBJECT (object, "stop called");
- gst_buffer_unmap (buf, &map);
- gst_buffer_unref (buf);
- return NULL;
+ return GST_FLOW_OK;
+stopped:
+ {
+ GST_DEBUG_OBJECT (object, "stop called");
+ gst_buffer_unmap (buf, &map);
+ gst_buffer_unref (buf);
+ return GST_FLOW_WRONG_STATE;
+ }
select_error:
- GST_ELEMENT_ERROR (object, RESOURCE, READ, (NULL),
- ("select error %d: %s (%d)", ret_val, g_strerror (errno), errno));
- gst_buffer_unmap (buf, &map);
- gst_buffer_unref (buf);
- return NULL;
+ {
+ GST_ELEMENT_ERROR (object, RESOURCE, READ, (NULL),
+ ("select error %d: %s (%d)", ret_val, g_strerror (errno), errno));
+ gst_buffer_unmap (buf, &map);
+ gst_buffer_unref (buf);
+ return GST_FLOW_ERROR;
+ }
}
static GstFlowReturn
@@ -979,10 +984,7 @@ 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 = gst_dvbsrc_read_device (object, buffer_size);
- if (*buf != NULL) {
- retval = GST_FLOW_OK;
- }
+ retval = gst_dvbsrc_read_device (object, buffer_size, buf);
if (object->stats_interval != 0 &&
++object->stats_counter == object->stats_interval) {