diff options
author | Philippe Normand <philn@igalia.com> | 2015-05-11 12:16:52 +0300 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.com> | 2020-07-10 18:45:13 +0300 |
commit | cda483cb3c18b6666efbdfaf5a4800e30b888606 (patch) | |
tree | 09b447c307608a9b9beb7ecc2be306f5f65bafca /sys | |
parent | 1a4870d13ddaf557fe62952ba34a56484d8418fe (diff) |
rpicamsrc: Basic orientation interface support
The (h,v)flip attributes are now supported through this interface.
It should also be possible to support (h,v)center attributes using the
ROI properties.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/rpicamsrc/gstrpicamsrc.c | 78 |
1 files changed, 77 insertions, 1 deletions
diff --git a/sys/rpicamsrc/gstrpicamsrc.c b/sys/rpicamsrc/gstrpicamsrc.c index 0e831e5bb..8272188e0 100644 --- a/sys/rpicamsrc/gstrpicamsrc.c +++ b/sys/rpicamsrc/gstrpicamsrc.c @@ -188,6 +188,7 @@ static void gst_rpi_cam_src_finalize (GObject *object); static void gst_rpi_cam_src_colorbalance_init (GstColorBalanceInterface * iface); +static void gst_rpi_cam_src_orientation_init (GstVideoOrientationInterface * iface); static void gst_rpi_cam_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -210,7 +211,9 @@ static gboolean gst_rpi_cam_src_send_event (GstElement * element, G_DEFINE_TYPE_WITH_CODE (GstRpiCamSrc, gst_rpi_cam_src, GST_TYPE_PUSH_SRC, G_IMPLEMENT_INTERFACE (GST_TYPE_COLOR_BALANCE, - gst_rpi_cam_src_colorbalance_init)); + gst_rpi_cam_src_colorbalance_init); + G_IMPLEMENT_INTERFACE (GST_TYPE_VIDEO_ORIENTATION, + gst_rpi_cam_src_orientation_init)); #define C_ENUM(v) ((gint) v) @@ -583,6 +586,79 @@ gst_rpi_cam_src_colorbalance_init (GstColorBalanceInterface * iface) iface->get_balance_type = gst_rpi_cam_src_colorbalance_get_balance_type; } +static gboolean +gst_rpi_cam_src_orientation_get_hflip (GstVideoOrientation * orientation, gboolean * flip) +{ + GstRpiCamSrc *src = GST_RPICAMSRC (orientation); + + g_return_val_if_fail (src != NULL, FALSE); + g_return_val_if_fail (GST_IS_RPICAMSRC (src), FALSE); + + g_mutex_lock (&src->config_lock); + *flip = src->capture_config.camera_parameters.hflip; + g_mutex_unlock (&src->config_lock); + + return TRUE; +} + +static gboolean +gst_rpi_cam_src_orientation_get_vflip (GstVideoOrientation * orientation, gboolean * flip) +{ + GstRpiCamSrc *src = GST_RPICAMSRC (orientation); + + g_return_val_if_fail (src != NULL, FALSE); + g_return_val_if_fail (GST_IS_RPICAMSRC (src), FALSE); + + g_mutex_lock (&src->config_lock); + *flip = src->capture_config.camera_parameters.vflip; + g_mutex_unlock (&src->config_lock); + + return TRUE; +} + +static gboolean +gst_rpi_cam_src_orientation_set_hflip (GstVideoOrientation * orientation, gboolean flip) +{ + GstRpiCamSrc *src = GST_RPICAMSRC (orientation); + + g_return_val_if_fail (src != NULL, FALSE); + g_return_val_if_fail (GST_IS_RPICAMSRC (src), FALSE); + + g_mutex_lock (&src->config_lock); + src->capture_config.camera_parameters.hflip = flip; + src->capture_config.change_flags |= PROP_CHANGE_ORIENTATION; + g_mutex_unlock (&src->config_lock); + + return TRUE; +} + +static gboolean +gst_rpi_cam_src_orientation_set_vflip (GstVideoOrientation * orientation, gboolean flip) +{ + GstRpiCamSrc *src = GST_RPICAMSRC (orientation); + + g_return_val_if_fail (src != NULL, FALSE); + g_return_val_if_fail (GST_IS_RPICAMSRC (src), FALSE); + + g_mutex_lock (&src->config_lock); + src->capture_config.camera_parameters.vflip = flip; + src->capture_config.change_flags |= PROP_CHANGE_ORIENTATION; + g_mutex_unlock (&src->config_lock); + + return TRUE; +} + +static void +gst_rpi_cam_src_orientation_init (GstVideoOrientationInterface * iface) +{ + iface->get_hflip = gst_rpi_cam_src_orientation_get_hflip; + iface->set_hflip = gst_rpi_cam_src_orientation_set_hflip; + iface->get_vflip = gst_rpi_cam_src_orientation_get_vflip; + iface->set_vflip = gst_rpi_cam_src_orientation_set_vflip; + + /* TODO: hcenter / vcenter support */ +} + static void gst_rpi_cam_src_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) |