From 0341f04ce161e9a09345ffe84036bdb023c4e94f Mon Sep 17 00:00:00 2001 From: Xabier Rodriguez Calvar Date: Tue, 26 Jul 2016 19:14:40 +0200 Subject: [PATCH] videodirection: interface for rotation and flip A GstVideoOrientationMethod enumeration is also provided for the admitted property values. https://bugzilla.gnome.org/show_bug.cgi?id=768687 --- docs/libs/gst-plugins-base-libs-docs.sgml | 1 + docs/libs/gst-plugins-base-libs-sections.txt | 15 +++++ docs/libs/gst-plugins-base-libs.types | 2 + gst-libs/gst/video/Makefile.am | 2 + gst-libs/gst/video/video.h | 31 ++++++++++ gst-libs/gst/video/videodirection.c | 52 ++++++++++++++++ gst-libs/gst/video/videodirection.h | 62 ++++++++++++++++++++ gst-plugins-base.spec.in | 1 + tests/check/libs/gstlibscpp.cc | 1 + tests/check/libs/libsabi.c | 1 + tests/icles/test-header-compile | 2 +- 11 files changed, 169 insertions(+), 1 deletion(-) create mode 100644 gst-libs/gst/video/videodirection.c create mode 100644 gst-libs/gst/video/videodirection.h diff --git a/docs/libs/gst-plugins-base-libs-docs.sgml b/docs/libs/gst-plugins-base-libs-docs.sgml index 57e2407803..7e7a58c991 100644 --- a/docs/libs/gst-plugins-base-libs-docs.sgml +++ b/docs/libs/gst-plugins-base-libs-docs.sgml @@ -209,6 +209,7 @@ + diff --git a/docs/libs/gst-plugins-base-libs-sections.txt b/docs/libs/gst-plugins-base-libs-sections.txt index 4229f90d7a..33e64f832b 100644 --- a/docs/libs/gst-plugins-base-libs-sections.txt +++ b/docs/libs/gst-plugins-base-libs-sections.txt @@ -880,6 +880,19 @@ GST_IS_STREAM_VOLUME_INTERFACE gst_stream_volume_get_type +
+gstvideodirection +gst/video/videodirection.h +GstVideoDirection +GstVideoDirectionInterface + +GST_TYPE_VIDEO_DIRECTION +GST_VIDEO_DIRECTION +GST_IS_VIDEO_DIRECTION +GST_VIDEO_DIRECTION_GET_INTERFACE +gst_video_direction_get_type +
+
gstvideoorientation gst/video/videoorientation.h @@ -2365,6 +2378,8 @@ GST_META_TAG_VIDEO_ORIENTATION_STR GST_META_TAG_VIDEO_SIZE_STR GST_META_TAG_VIDEO_COLORSPACE_STR +GstVideoOrientationMethod + #video-event.h gst_video_event_new_still_frame diff --git a/docs/libs/gst-plugins-base-libs.types b/docs/libs/gst-plugins-base-libs.types index 6ce1f36262..031229f7eb 100644 --- a/docs/libs/gst-plugins-base-libs.types +++ b/docs/libs/gst-plugins-base-libs.types @@ -43,6 +43,8 @@ gst_video_sink_get_type #include gst_color_balance_get_type gst_color_balance_channel_get_type +#include +gst_video_direction_get_type #include gst_video_orientation_get_type #include diff --git a/gst-libs/gst/video/Makefile.am b/gst-libs/gst/video/Makefile.am index 979bf17607..64f49786d8 100644 --- a/gst-libs/gst/video/Makefile.am +++ b/gst-libs/gst/video/Makefile.am @@ -38,6 +38,7 @@ libgstvideo_@GST_API_VERSION@_la_SOURCES = \ gstvideoaffinetransformationmeta.c \ gstvideometa.c \ gstvideopool.c \ + videodirection.c \ videoorientation.c \ videooverlay.c \ gstvideodecoder.c \ @@ -73,6 +74,7 @@ libgstvideo_@GST_API_VERSION@include_HEADERS = \ gstvideometa.h \ gstvideoaffinetransformationmeta.h \ gstvideopool.h \ + videodirection.h \ videoorientation.h \ videooverlay.h \ gstvideodecoder.h \ diff --git a/gst-libs/gst/video/video.h b/gst-libs/gst/video/video.h index 3f23502044..f890eaefed 100644 --- a/gst-libs/gst/video/video.h +++ b/gst-libs/gst/video/video.h @@ -57,6 +57,36 @@ struct _GstVideoAlignment guint stride_align[GST_VIDEO_MAX_PLANES]; }; +/** + * GstVideoOrientationMethod: + * @GST_VIDEO_ORIENTATION_IDENTITY: Identity (no rotation) + * @GST_VIDEO_ORIENTATION_90R: Rotate clockwise 90 degrees + * @GST_VIDEO_ORIENTATION_180: Rotate 180 degrees + * @GST_VIDEO_ORIENTATION_90L: Rotate counter-clockwise 90 degrees + * @GST_VIDEO_ORIENTATION_HORIZ: Flip horizontally + * @GST_VIDEO_ORIENTATION_VERT: Flip vertically + * @GST_VIDEO_ORIENTATION_UL_LR: Flip across upper left/lower right diagonal + * @GST_VIDEO_ORIENTATION_UR_LL: Flip across upper right/lower left diagonal + * @GST_VIDEO_ORIENTATION_AUTO: Select flip method based on image-orientation tag + * @GST_VIDEO_ORIENTATION_CUSTOM: Current status depends on plugin internal setup + * + * The different video orientation methods. + * + * Since: 1.10 + */ +typedef enum { + GST_VIDEO_ORIENTATION_IDENTITY, + GST_VIDEO_ORIENTATION_90R, + GST_VIDEO_ORIENTATION_180, + GST_VIDEO_ORIENTATION_90L, + GST_VIDEO_ORIENTATION_HORIZ, + GST_VIDEO_ORIENTATION_VERT, + GST_VIDEO_ORIENTATION_UL_LR, + GST_VIDEO_ORIENTATION_UR_LL, + GST_VIDEO_ORIENTATION_AUTO, + GST_VIDEO_ORIENTATION_CUSTOM, +} GstVideoOrientationMethod; + /* metadata macros */ /** * GST_META_TAG_VIDEO_STR: @@ -137,6 +167,7 @@ G_END_DECLS #include #include #include +#include #include #include #include diff --git a/gst-libs/gst/video/videodirection.c b/gst-libs/gst/video/videodirection.c new file mode 100644 index 0000000000..da908a9c28 --- /dev/null +++ b/gst-libs/gst/video/videodirection.c @@ -0,0 +1,52 @@ +/* GStreamer + * Copyright (C) 2016 Igalia + * + * videodirection.c: video rotation and flipping interface + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "video.h" + +#define PROP_DIRECTION_DEFAULT GST_VIDEO_ORIENTATION_IDENTITY + +/** + * SECTION:gstvideodirection + * @short_description: Interface for elements providing video + * rotation and flipping controls + * + * The interface allows unified access to control flipping and rotation + * operations of video-sources or operators. + * + * Since: 1.10 + */ + +G_DEFINE_INTERFACE (GstVideoDirection, gst_video_direction, 0); + +static void +gst_video_direction_default_init (GstVideoDirectionInterface * iface) +{ + g_object_interface_install_property (iface, + g_param_spec_enum ("video-direction", "Video direction", + "Video direction: rotation and flipping", + GST_TYPE_VIDEO_ORIENTATION_METHOD, PROP_DIRECTION_DEFAULT, + GST_PARAM_CONTROLLABLE | G_PARAM_READWRITE | G_PARAM_CONSTRUCT | + G_PARAM_STATIC_STRINGS)); +} diff --git a/gst-libs/gst/video/videodirection.h b/gst-libs/gst/video/videodirection.h new file mode 100644 index 0000000000..1428489ed7 --- /dev/null +++ b/gst-libs/gst/video/videodirection.h @@ -0,0 +1,62 @@ +/* GStreamer + * Copyright (C) 2016 Igalia + * + * videodirection.h: video rotation and flipping interface + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +#ifndef __GST_VIDEO_DIRECTION_H__ +#define __GST_VIDEO_DIRECTION_H__ + +#include + +G_BEGIN_DECLS +#define GST_TYPE_VIDEO_DIRECTION \ + (gst_video_direction_get_type ()) +#define GST_VIDEO_DIRECTION(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VIDEO_DIRECTION, GstVideoDirection)) +#define GST_IS_VIDEO_DIRECTION(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VIDEO_DIRECTION)) +#define GST_VIDEO_DIRECTION_GET_INTERFACE(inst) \ + (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_VIDEO_DIRECTION, GstVideoDirectionInterface)) +/** + * GstVideoDirection: + * + * Opaque #GstVideoDirection data structure. + * + * Since: 1.10 + */ +typedef struct _GstVideoDirection GstVideoDirection; +typedef struct _GstVideoDirectionInterface GstVideoDirectionInterface; + +/** + * GstVideoDirectionInterface: + * @iface: parent interface type. + * + * #GstVideoDirectionInterface interface. + * + * Since: 1.10 + */ +struct _GstVideoDirectionInterface +{ + GTypeInterface iface; +}; + +GType gst_video_direction_get_type (void); + +G_END_DECLS +#endif /* __GST_VIDEO_DIRECTION_H__ */ diff --git a/gst-plugins-base.spec.in b/gst-plugins-base.spec.in index c9613f0cfe..47e46e77a1 100644 --- a/gst-plugins-base.spec.in +++ b/gst-plugins-base.spec.in @@ -221,6 +221,7 @@ GStreamer Plugins Base library development and header files. %{_includedir}/gstreamer-%{majorminor}/gst/audio/streamvolume.h %{_includedir}/gstreamer-%{majorminor}/gst/video/colorbalance.h %{_includedir}/gstreamer-%{majorminor}/gst/video/colorbalancechannel.h +%{_includedir}/gstreamer-%{majorminor}/gst/video/videodirection.h %{_includedir}/gstreamer-%{majorminor}/gst/video/videoorientation.h %{_includedir}/gstreamer-%{majorminor}/gst/video/videooverlay.h %{_includedir}/gstreamer-%{majorminor}/gst/app/app.h diff --git a/tests/check/libs/gstlibscpp.cc b/tests/check/libs/gstlibscpp.cc index 5a84ea3e0c..049cac8359 100644 --- a/tests/check/libs/gstlibscpp.cc +++ b/tests/check/libs/gstlibscpp.cc @@ -89,6 +89,7 @@ #include #include #include +#include #include #include #include diff --git a/tests/check/libs/libsabi.c b/tests/check/libs/libsabi.c index 508406ad5c..316826e45d 100644 --- a/tests/check/libs/libsabi.c +++ b/tests/check/libs/libsabi.c @@ -62,6 +62,7 @@ #include #include #include +#include #include #include #include diff --git a/tests/icles/test-header-compile b/tests/icles/test-header-compile index 1e1ffcc8dc..02a17b5c39 100644 --- a/tests/icles/test-header-compile +++ b/tests/icles/test-header-compile @@ -48,7 +48,7 @@ for lib in allocators app audio fft pbutils riff rtp rtsp sdp tag video ; do video-info.h video-frame.h gstvideosink.h gstvideofilter.h \ gstvideometa.h gstvideopool.h videoorientation.h videooverlay.h \ gstvideodecoder.h gstvideoencoder.h gstvideoutils.h \ - video-blend.h video-overlay-composition.h" + video-blend.h video-overlay-composition.h videodirection.h" fi CFLAGS=`pkg-config --cflags gstreamer-1.0 gstreamer-$lib-1.0`