diff --git a/gst/videocrop/gstaspectratiocrop.c b/gst/videocrop/gstaspectratiocrop.c index 9ca93c1ff8..999dcd2877 100644 --- a/gst/videocrop/gstaspectratiocrop.c +++ b/gst/videocrop/gstaspectratiocrop.c @@ -41,6 +41,8 @@ #include #include +#include "gstvideocrop.h" +#include "gstvideocropelements.h" #include "gstaspectratiocrop.h" #include "gst/glib-compat-private.h" @@ -75,6 +77,8 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", #define gst_aspect_ratio_crop_parent_class parent_class G_DEFINE_TYPE (GstAspectRatioCrop, gst_aspect_ratio_crop, GST_TYPE_BIN); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (aspectratiocrop, "aspectratiocrop", + GST_RANK_NONE, GST_TYPE_ASPECT_RATIO_CROP, videocrop_element_init (plugin)); static void gst_aspect_ratio_crop_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); diff --git a/gst/videocrop/gstvideocrop.c b/gst/videocrop/gstvideocrop.c index 71f36ff4fe..4f37970426 100644 --- a/gst/videocrop/gstvideocrop.c +++ b/gst/videocrop/gstvideocrop.c @@ -61,12 +61,11 @@ #include #include "gstvideocrop.h" +#include "gstvideocropelements.h" #include "gstaspectratiocrop.h" #include -GST_DEBUG_CATEGORY_STATIC (videocrop_debug); -#define GST_CAT_DEFAULT videocrop_debug enum { @@ -102,6 +101,8 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", #define gst_video_crop_parent_class parent_class G_DEFINE_TYPE (GstVideoCrop, gst_video_crop, GST_TYPE_VIDEO_FILTER); +GST_ELEMENT_REGISTER_DEFINE_WITH_CODE (videocrop, "videocrop", GST_RANK_NONE, + GST_TYPE_VIDEO_CROP, videocrop_element_init (plugin)); static void gst_video_crop_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); @@ -946,23 +947,3 @@ gst_video_crop_get_property (GObject * object, guint prop_id, GValue * value, } GST_OBJECT_UNLOCK (video_crop); } - -static gboolean -plugin_init (GstPlugin * plugin) -{ - GST_DEBUG_CATEGORY_INIT (videocrop_debug, "videocrop", 0, "videocrop"); - - if (gst_element_register (plugin, "videocrop", GST_RANK_NONE, - GST_TYPE_VIDEO_CROP) - && gst_element_register (plugin, "aspectratiocrop", GST_RANK_NONE, - GST_TYPE_ASPECT_RATIO_CROP)) - return TRUE; - - return FALSE; -} - -GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, - GST_VERSION_MINOR, - videocrop, - "Crops video into a user-defined region", - plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/videocrop/gstvideocropelement.c b/gst/videocrop/gstvideocropelement.c new file mode 100644 index 0000000000..db1a1cb23d --- /dev/null +++ b/gst/videocrop/gstvideocropelement.c @@ -0,0 +1,76 @@ +/* GStreamer video frame cropping + * Copyright (C) 2006 Tim-Philipp Müller + * + * 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. + */ + +/** + * SECTION:element-videocrop + * @title: videocrop + * @see_also: #GstVideoBox + * + * This element crops video frames, meaning it can remove parts of the + * picture on the left, right, top or bottom of the picture and output + * a smaller picture than the input picture, with the unwanted parts at the + * border removed. + * + * The videocrop element is similar to the videobox element, but its main + * goal is to support a multitude of formats as efficiently as possible. + * Unlike videbox, it cannot add borders to the picture and unlike videbox + * it will always output images in exactly the same format as the input image. + * + * If there is nothing to crop, the element will operate in pass-through mode. + * + * Note that no special efforts are made to handle chroma-subsampled formats + * in the case of odd-valued cropping and compensate for sub-unit chroma plane + * shifts for such formats in the case where the #GstVideoCrop:left or + * #GstVideoCrop:top property is set to an odd number. This doesn't matter for + * most use cases, but it might matter for yours. + * + * ## Example launch line + * |[ + * gst-launch-1.0 -v videotestsrc ! videocrop top=42 left=1 right=4 bottom=0 ! ximagesink + * ]| + * + */ + +/* TODO: + * - for packed formats, we could avoid memcpy() in case crop_left + * and crop_right are 0 and just create a sub-buffer of the input + * buffer + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include + +#include "gstvideocropelements.h" + +GST_DEBUG_CATEGORY_STATIC (videocrop_debug); +#define GST_CAT_DEFAULT videocrop_debug + +void +videocrop_element_init (GstPlugin * plugin) +{ + static gsize res = FALSE; + if (g_once_init_enter (&res)) { + GST_DEBUG_CATEGORY_INIT (videocrop_debug, "videocrop", 0, "videocrop"); + g_once_init_leave (&res, TRUE); + } +} diff --git a/gst/videocrop/gstvideocropelements.h b/gst/videocrop/gstvideocropelements.h new file mode 100644 index 0000000000..42b408152d --- /dev/null +++ b/gst/videocrop/gstvideocropelements.h @@ -0,0 +1,34 @@ +/* GStreamer video frame cropping + * Copyright (C) 2006 Tim-Philipp Müller + * + * 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_CROP_ELEMENTS_H__ +#define __GST_VIDEO_CROP_ELEMENTS_H__ + +#include + +G_BEGIN_DECLS + +void videocrop_element_init (GstPlugin * plugin); + +GST_ELEMENT_REGISTER_DECLARE (aspectratiocrop); +GST_ELEMENT_REGISTER_DECLARE (videocrop); + +G_END_DECLS + +#endif /* __GST_VIDEO_CROP_ELEMENTS_H__ */ diff --git a/gst/videocrop/gstvideocropplugin.c b/gst/videocrop/gstvideocropplugin.c new file mode 100644 index 0000000000..e10ae10183 --- /dev/null +++ b/gst/videocrop/gstvideocropplugin.c @@ -0,0 +1,42 @@ +/* GStreamer video frame cropping + * Copyright (C) 2006 Tim-Philipp Müller + * + * 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 "gstvideocropelements.h" + +static gboolean +plugin_init (GstPlugin * plugin) +{ + gboolean ret = FALSE; + + ret |= GST_ELEMENT_REGISTER (videocrop, plugin); + ret |= GST_ELEMENT_REGISTER (aspectratiocrop, plugin); + + return ret; +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + videocrop, + "Crops video into a user-defined region", + plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) diff --git a/gst/videocrop/meson.build b/gst/videocrop/meson.build index 9261335252..fd6b67a601 100644 --- a/gst/videocrop/meson.build +++ b/gst/videocrop/meson.build @@ -1,5 +1,5 @@ gstvideocrop = library('gstvideocrop', - 'gstvideocrop.c', 'gstaspectratiocrop.c', + 'gstvideocrop.c', 'gstaspectratiocrop.c','gstvideocropelement.c', 'gstvideocropplugin.c', c_args : gst_plugins_good_args, include_directories : [configinc, libsinc], dependencies : [gst_dep, gstbase_dep, gstvideo_dep],