From d4c24cc52f3561649bae77f0fa441ffbd4f6d275 Mon Sep 17 00:00:00 2001 From: Nicolas Dufresne Date: Thu, 20 Mar 2014 15:31:22 -0400 Subject: [PATCH] v4l2transform: Setup cropping if needed --- sys/v4l2/gstv4l2object.c | 33 +++++++++++++++++++++++++++++++++ sys/v4l2/gstv4l2object.h | 2 ++ sys/v4l2/gstv4l2transform.c | 15 +++++++++++---- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c index 36a2968a2..ab06ebf86 100644 --- a/sys/v4l2/gstv4l2object.c +++ b/sys/v4l2/gstv4l2object.c @@ -2825,6 +2825,39 @@ unsupported_format: } } +gboolean +gst_v4l2_object_set_crop (GstV4l2Object * obj) +{ + struct v4l2_crop crop = { 0 }; + + crop.type = obj->type; + crop.c.left = obj->align.padding_left; + crop.c.top = obj->align.padding_top; + crop.c.width = obj->info.width; + crop.c.height = obj->info.height; + + if (obj->align.padding_left + obj->align.padding_top + + obj->align.padding_right + obj->align.padding_bottom == 0) { + GST_DEBUG_OBJECT (obj->element, "no cropping needed"); + return TRUE; + } + + GST_DEBUG_OBJECT (obj->element, + "Desired cropping left %u, top %u, size %ux%u", crop.c.left, crop.c.top, + crop.c.width, crop.c.height); + + if (v4l2_ioctl (obj->video_fd, VIDIOC_S_CROP, &crop) < 0) { + GST_WARNING_OBJECT (obj->element, "VIDIOC_S_CROP failed"); + return FALSE; + } + + GST_DEBUG_OBJECT (obj->element, + "Got cropping left %u, top %u, size %ux%u", crop.c.left, crop.c.top, + crop.c.width, crop.c.height); + + return TRUE; +} + gboolean gst_v4l2_object_caps_equal (GstV4l2Object * v4l2object, GstCaps * caps) { diff --git a/sys/v4l2/gstv4l2object.h b/sys/v4l2/gstv4l2object.h index cbf27eefd..6bea091ae 100644 --- a/sys/v4l2/gstv4l2object.h +++ b/sys/v4l2/gstv4l2object.h @@ -262,6 +262,8 @@ GstCaps * gst_v4l2_object_get_caps (GstV4l2Object * v4l2object, gboolean gst_v4l2_object_acquire_format (GstV4l2Object * v4l2object, GstVideoInfo * info); + +gboolean gst_v4l2_object_set_crop (GstV4l2Object * obj); gboolean gst_v4l2_object_decide_allocation (GstV4l2Object * v4l2object, GstQuery * query); diff --git a/sys/v4l2/gstv4l2transform.c b/sys/v4l2/gstv4l2transform.c index cfcd60dce..3c05db6b6 100644 --- a/sys/v4l2/gstv4l2transform.c +++ b/sys/v4l2/gstv4l2transform.c @@ -209,23 +209,30 @@ gst_v4l2_transform_set_caps (GstBaseTransform * trans, GstCaps * incaps, if (!gst_v4l2_object_set_format (self->v4l2capture, outcaps)) goto outcaps_failed; - return TRUE; + /* FIXME implement fallback if crop not supported */ + if (!gst_v4l2_object_set_crop (self->v4l2output)) + goto failed; + + if (!gst_v4l2_object_set_crop (self->v4l2capture)) + goto failed; + return TRUE; incaps_failed: { GST_ERROR_OBJECT (self, "failed to set input caps: %" GST_PTR_FORMAT, incaps); - return FALSE; + goto failed; } - outcaps_failed: { gst_v4l2_object_stop (self->v4l2output); GST_ERROR_OBJECT (self, "failed to set output caps: %" GST_PTR_FORMAT, outcaps); - return FALSE; + goto failed; } +failed: + return FALSE; } static gboolean -- GitLab