summaryrefslogtreecommitdiffstats
path: root/sys/v4l2/gstv4l2src.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/v4l2/gstv4l2src.c')
-rw-r--r--sys/v4l2/gstv4l2src.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c
index 783a6bd1..1178f5a8 100644
--- a/sys/v4l2/gstv4l2src.c
+++ b/sys/v4l2/gstv4l2src.c
@@ -202,6 +202,12 @@ static void gst_v4l2src_set_property (GObject * object, guint prop_id,
static void gst_v4l2src_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
+/* get_frame io methods */
+static GstFlowReturn
+gst_v4l2src_get_read (GstV4l2Src * v4l2src, GstBuffer ** buf);
+static GstFlowReturn
+gst_v4l2src_get_mmap (GstV4l2Src * v4l2src, GstBuffer ** buf);
+
static void
gst_v4l2src_base_init (gpointer g_class)
{
@@ -616,6 +622,12 @@ gst_v4l2src_set_caps (GstBaseSrc * src, GstCaps * caps)
if (!gst_v4l2src_capture_init (v4l2src, caps))
return FALSE;
+ if (v4l2src->use_mmap) {
+ v4l2src->get_frame = gst_v4l2src_get_mmap;
+ } else {
+ v4l2src->get_frame = gst_v4l2src_get_read;
+ }
+
if (!gst_v4l2src_capture_start (v4l2src))
return FALSE;
@@ -850,7 +862,7 @@ gst_v4l2src_get_mmap (GstV4l2Src * v4l2src, GstBuffer ** buf)
again:
ret = gst_v4l2src_grab_frame (v4l2src, &temp);
- if (ret != GST_FLOW_OK)
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
goto done;
if (v4l2src->frame_byte_size > 0) {
@@ -889,13 +901,9 @@ gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf)
GstV4l2Src *v4l2src = GST_V4L2SRC (src);
GstFlowReturn ret;
- if (v4l2src->use_mmap) {
- ret = gst_v4l2src_get_mmap (v4l2src, buf);
- } else {
- ret = gst_v4l2src_get_read (v4l2src, buf);
- }
+ ret = v4l2src->get_frame (v4l2src, buf);
/* set buffer metadata */
- if (ret == GST_FLOW_OK && *buf) {
+ if (G_LIKELY (ret == GST_FLOW_OK && *buf)) {
GstClock *clock;
GstClockTime timestamp;