mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-22 07:08:23 +00:00
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.
This commit is contained in:
parent
1a4870d13d
commit
cda483cb3c
2 changed files with 147 additions and 1 deletions
|
@ -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)
|
||||
|
|
70
tests/examples/rpicamsrc/test_orientation.c
Normal file
70
tests/examples/rpicamsrc/test_orientation.c
Normal file
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
* Copyright (c) 2015, Igalia S.L
|
||||
* Author: Philippe Normand <philn@igalia.com>
|
||||
* Licence: LGPL. (See COPYING.LGPL)
|
||||
*/
|
||||
|
||||
#include <glib.h>
|
||||
#include <gst/gst.h>
|
||||
#include <gst/video/videoorientation.h>
|
||||
|
||||
#define PIPELINE "rpicamsrc name=src preview=0 fullscreen=0 ! h264parse ! omxh264dec ! glimagesink sync=0"
|
||||
|
||||
void configure_orientation(GstVideoOrientation* orientation)
|
||||
{
|
||||
gboolean flip;
|
||||
|
||||
if (gst_video_orientation_get_hflip(orientation, &flip)) {
|
||||
g_print("current hflip: %s\n", flip ? "enabled" : "disabled");
|
||||
|
||||
if (g_getenv("HFLIP"))
|
||||
gst_video_orientation_set_hflip(orientation, TRUE);
|
||||
|
||||
gst_video_orientation_get_hflip(orientation, &flip);
|
||||
g_print("new hflip: %s\n", flip ? "enabled" : "disabled");
|
||||
}
|
||||
|
||||
if (gst_video_orientation_get_vflip(orientation, &flip)) {
|
||||
g_print("current vflip: %s\n", flip ? "enabled" : "disabled");
|
||||
|
||||
if (g_getenv("VFLIP"))
|
||||
gst_video_orientation_set_vflip(orientation, TRUE);
|
||||
|
||||
gst_video_orientation_get_vflip(orientation, &flip);
|
||||
g_print("new vflip: %s\n", flip ? "enabled" : "disabled");
|
||||
}
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
GMainLoop* loop;
|
||||
GstElement* pipeline;
|
||||
GError* error = NULL;
|
||||
GstElement* src;
|
||||
GstVideoOrientation* orientation;
|
||||
|
||||
gst_init(&argc, &argv);
|
||||
loop = g_main_loop_new(NULL, FALSE);
|
||||
|
||||
pipeline = gst_parse_launch(PIPELINE, &error);
|
||||
if (error != NULL) {
|
||||
g_printerr("Error parsing '%s': %s", PIPELINE, error->message);
|
||||
g_error_free(error);
|
||||
return -1;
|
||||
}
|
||||
|
||||
gst_element_set_state(pipeline, GST_STATE_PLAYING);
|
||||
src = gst_bin_get_by_name(GST_BIN(pipeline), "src");
|
||||
if (!src) {
|
||||
g_printerr("Source element not found\n");
|
||||
return -2;
|
||||
}
|
||||
|
||||
orientation = GST_VIDEO_ORIENTATION(src);
|
||||
configure_orientation(orientation);
|
||||
g_main_loop_run(loop);
|
||||
|
||||
gst_object_unref(src);
|
||||
gst_element_set_state(pipeline, GST_STATE_NULL);
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue