diff --git a/ChangeLog b/ChangeLog index d6aa5cebbe..32af8d73ff 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,22 @@ +2006-09-18 Stefan Kost,,, + + * docs/libs/gst-plugins-base-libs-docs.sgml: + * docs/libs/gst-plugins-base-libs.types: + * gst-libs/gst/interfaces/Makefile.am: + * gst-libs/gst/interfaces/videoorientation.c: + (gst_video_orientation_get_type), + (gst_video_orientation_iface_init), + (gst_video_orientation_get_hflip), + (gst_video_orientation_get_vflip), + (gst_video_orientation_get_hcenter), + (gst_video_orientation_get_vcenter), + (gst_video_orientation_set_hflip), + (gst_video_orientation_set_vflip), + (gst_video_orientation_set_hcenter), + (gst_video_orientation_set_vcenter): + * gst-libs/gst/interfaces/videoorientation.h: + Add new interface to control video orientation (fixes #354908) + 2006-09-18 Stefan Kost * gst/videotestsrc/gstvideotestsrc.c: diff --git a/docs/libs/gst-plugins-base-libs-docs.sgml b/docs/libs/gst-plugins-base-libs-docs.sgml index 5e33541457..90f9fd890c 100644 --- a/docs/libs/gst-plugins-base-libs-docs.sgml +++ b/docs/libs/gst-plugins-base-libs-docs.sgml @@ -30,6 +30,7 @@ + @@ -123,6 +124,7 @@ &GstTuner; &GstTunerChannel; &GstTunerNorm; + &GstVideoorientation; &GstXOverlay; diff --git a/docs/libs/gst-plugins-base-libs.types b/docs/libs/gst-plugins-base-libs.types index b25ab23027..3e670fced7 100644 --- a/docs/libs/gst-plugins-base-libs.types +++ b/docs/libs/gst-plugins-base-libs.types @@ -36,6 +36,8 @@ gst_property_probe_get_type gst_tuner_get_type gst_tuner_channel_get_type gst_tuner_norm_get_type +#include +gst_video_orientation_get_type #include gst_x_overlay_get_type diff --git a/gst-libs/gst/interfaces/Makefile.am b/gst-libs/gst/interfaces/Makefile.am index 7ace1e9d2c..b78881b6ab 100644 --- a/gst-libs/gst/interfaces/Makefile.am +++ b/gst-libs/gst/interfaces/Makefile.am @@ -13,6 +13,7 @@ headers_interfaces = \ tuner.h \ tunernorm.h \ tunerchannel.h \ + videoorientation.h \ xoverlay.h # variables used for enum/marshal generation @@ -47,6 +48,7 @@ libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES = \ tuner.c \ tunernorm.c \ tunerchannel.c \ + videoorientation.c \ xoverlay.c nodist_libgstinterfaces_@GST_MAJORMINOR@_la_SOURCES = \ diff --git a/gst-libs/gst/interfaces/videoorientation.c b/gst-libs/gst/interfaces/videoorientation.c new file mode 100644 index 0000000000..778d17cad7 --- /dev/null +++ b/gst-libs/gst/interfaces/videoorientation.c @@ -0,0 +1,260 @@ +/* GStreamer + * Copyright (C) 2006 Nokia + * + * videoorientation.c: video flipping and centering 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., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "videoorientation.h" +#include "interfaces-marshal.h" + +#include + +/** + * SECTION:gstvideoorientation + * @short_description: Interface for elements providing video orientation + * controls + * + * The interface allows unified access to control flipping and autocenter + * operation of video-sources or operators. + */ + +static void gst_video_orientation_iface_init (GstVideoOrientationInterface * + iface); + +GType +gst_video_orientation_get_type (void) +{ + static GType gst_video_orientation_type = 0; + + if (!gst_video_orientation_type) { + static const GTypeInfo gst_video_orientation_info = { + sizeof (GstVideoOrientationInterface), + (GBaseInitFunc) gst_video_orientation_iface_init, + NULL, + NULL, + NULL, + NULL, + 0, + 0, + NULL, + }; + + gst_video_orientation_type = g_type_register_static (G_TYPE_INTERFACE, + "GstVideoOrientation", &gst_video_orientation_info, 0); + g_type_interface_add_prerequisite (gst_video_orientation_type, + GST_TYPE_IMPLEMENTS_INTERFACE); + } + + return gst_video_orientation_type; +} + +static void +gst_video_orientation_iface_init (GstVideoOrientationInterface * iface) +{ + /* default virtual functions */ + + iface->get_hflip = NULL; + iface->get_vflip = NULL; + iface->get_hcenter = NULL; + iface->get_vcenter = NULL; + + iface->set_hflip = NULL; + iface->set_vflip = NULL; + iface->set_hcenter = NULL; + iface->set_vcenter = NULL; +} + +/** + * gst_video_orientation_get_hflip: + * @video_orientation: #GstVideoOrientation interface of a #GstElement + * @flip: return location for the result + * + * Get the horizontal flipping state (%TRUE for flipped) from the given object. + * + * Returns: %TRUE in case the element supports flipping + */ +gboolean +gst_video_orientation_get_hflip (GstVideoOrientation * video_orientation, + gboolean * flip) +{ + GstVideoOrientationInterface *iface = + GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation); + + if (iface->get_hflip) { + return iface->get_hflip (video_orientation, flip); + } + return FALSE; +} + +/** + * gst_video_orientation_get_vflip: + * @video_orientation: #GstVideoOrientation interface of a #GstElement + * @flip: return location for the result + * + * Get the vertical flipping state (%TRUE for flipped) from the given object. + * + * Returns: %TRUE in case the element supports flipping + */ +gboolean +gst_video_orientation_get_vflip (GstVideoOrientation * video_orientation, + gboolean * flip) +{ + GstVideoOrientationInterface *iface = + GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation); + + if (iface->get_vflip) { + return iface->get_vflip (video_orientation, flip); + } + return FALSE; +} + +/** + * gst_video_orientation_get_hcenter: + * @video_orientation: #GstVideoOrientation interface of a #GstElement + * @center: return location for the result + * + * Get the horizontal centering offset from the given object. + * + * Returns: %TRUE in case the element supports centering + */ +gboolean +gst_video_orientation_get_hcenter (GstVideoOrientation * video_orientation, + gint * center) +{ + GstVideoOrientationInterface *iface = + GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation); + + if (iface->get_hcenter) { + return iface->get_hcenter (video_orientation, center); + } + return FALSE; +} + +/** + * gst_video_orientation_get_vcenter: + * @video_orientation: #GstVideoOrientation interface of a #GstElement + * @center: return location for the result + * + * Get the vertical centering offset from the given object. + * + * Returns: %TRUE in case the element supports centering + */ +gboolean +gst_video_orientation_get_vcenter (GstVideoOrientation * video_orientation, + gint * center) +{ + GstVideoOrientationInterface *iface = + GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation); + + if (iface->get_vcenter) { + return iface->get_vcenter (video_orientation, center); + } + return FALSE; +} + +/** + * gst_video_orientation_set_hflip: + * @video_orientation: #GstVideoOrientation interface of a #GstElement + * @flip: use flipping + * + * Set the horizontal flipping state (%TRUE for flipped) for the given object. + * + * Returns: %TRUE in case the element supports flipping + */ +gboolean +gst_video_orientation_set_hflip (GstVideoOrientation * video_orientation, + gboolean flip) +{ + GstVideoOrientationInterface *iface = + GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation); + + if (iface->set_hflip) { + return iface->set_hflip (video_orientation, flip); + } + return FALSE; +} + +/** + * gst_video_orientation_set_vflip: + * @video_orientation: #GstVideoOrientation interface of a #GstElement + * @flip: use flipping + * + * Set the vertical flipping state (%TRUE for flipped) for the given object. + * + * Returns: %TRUE in case the element supports flipping + */ +gboolean +gst_video_orientation_set_vflip (GstVideoOrientation * video_orientation, + gboolean flip) +{ + GstVideoOrientationInterface *iface = + GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation); + + if (iface->set_vflip) { + return iface->set_vflip (video_orientation, flip); + } + return FALSE; +} + +/** + * gst_video_orientation_set_hcenter: + * @video_orientation: #GstVideoOrientation interface of a #GstElement + * @center: centering offset + * + * Set the horizontal centering offset for the given object. + * + * Returns: %TRUE in case the element supports centering + */ +gboolean +gst_video_orientation_set_hcenter (GstVideoOrientation * video_orientation, + gint center) +{ + GstVideoOrientationInterface *iface = + GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation); + + if (iface->set_hcenter) { + return iface->set_hcenter (video_orientation, center); + } + return FALSE; +} + +/** + * gst_video_orientation_set_vcenter: + * @video_orientation: #GstVideoOrientation interface of a #GstElement + * @center: centering offset + * + * Set the vertical centering offset for the given object. + * + * Returns: %TRUE in case the element supports centering + */ +gboolean +gst_video_orientation_set_vcenter (GstVideoOrientation * video_orientation, + gint center) +{ + GstVideoOrientationInterface *iface = + GST_VIDEO_ORIENTATION_GET_IFACE (video_orientation); + + if (iface->set_vcenter) { + return iface->set_vcenter (video_orientation, center); + } + return FALSE; +} diff --git a/gst-libs/gst/interfaces/videoorientation.h b/gst-libs/gst/interfaces/videoorientation.h new file mode 100644 index 0000000000..67c06141a5 --- /dev/null +++ b/gst-libs/gst/interfaces/videoorientation.h @@ -0,0 +1,73 @@ +/* GStreamer + * Copyright (C) 2006 Nokia +#include + +G_BEGIN_DECLS + +#define GST_TYPE_VIDEO_ORIENTATION \ + (gst_video_orientation_get_type ()) +#define GST_VIDEO_ORIENTATION(obj) \ + (GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_VIDEO_ORIENTATION, GstVideoOrientation)) +#define GST_IS_VIDEO_ORIENTATION(obj) \ + (GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_VIDEO_ORIENTATION)) +#define GST_VIDEO_ORIENTATION_GET_IFACE(inst) \ + (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_VIDEO_ORIENTATION, GstVideoOrientationInterface)) + +typedef struct _GstVideoOrientation GstVideoOrientation; + +typedef struct _GstVideoOrientationInterface { + GTypeInterface parent; + + /* virtual functions */ + gboolean (* get_hflip) (GstVideoOrientation *video_orientation, gboolean *flip); + gboolean (* get_vflip) (GstVideoOrientation *video_orientation, gboolean *flip); + gboolean (* get_hcenter) (GstVideoOrientation *video_orientation, gint *center); + gboolean (* get_vcenter) (GstVideoOrientation *video_orientation, gint *center); + + gboolean (* set_hflip) (GstVideoOrientation *video_orientation, gboolean flip); + gboolean (* set_vflip) (GstVideoOrientation *video_orientation, gboolean flip); + gboolean (* set_hcenter) (GstVideoOrientation *video_orientation, gint center); + gboolean (* set_vcenter) (GstVideoOrientation *video_orientation, gint center); + + gpointer _gst_reserved[GST_PADDING]; +} GstVideoOrientationInterface; + +GType gst_video_orientation_get_type (void); + +/* virtual class function wrappers */ +gboolean gst_video_orientation_get_hflip (GstVideoOrientation *video_orientation, gboolean *flip); +gboolean gst_video_orientation_get_vflip (GstVideoOrientation *video_orientation, gboolean *flip); +gboolean gst_video_orientation_get_hcenter (GstVideoOrientation *video_orientation, gint *center); +gboolean gst_video_orientation_get_vcenter (GstVideoOrientation *video_orientation, gint *center); + +gboolean gst_video_orientation_set_hflip (GstVideoOrientation *video_orientation, gboolean flip); +gboolean gst_video_orientation_set_vflip (GstVideoOrientation *video_orientation, gboolean flip); +gboolean gst_video_orientation_set_hcenter (GstVideoOrientation *video_orientation, gint center); +gboolean gst_video_orientation_set_vcenter (GstVideoOrientation *video_orientation, gint center); + +G_END_DECLS + +#endif /* __GST_VIDEO_ORIENTATION_H__ */