videocrop: allow per feature registration

Split plugin into features including
dynamic types which can be indiviually
registered during a static build.

More details here:

https://gitlab.freedesktop.org/gstreamer/gst-build/-/merge_requests/199
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/661

Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-good/-/merge_requests/876>
This commit is contained in:
Stéphane Cerveau 2021-02-16 14:58:57 +01:00
parent 1eabad6d80
commit 8f1384c977
6 changed files with 160 additions and 23 deletions

View file

@ -41,6 +41,8 @@
#include <gst/gst.h> #include <gst/gst.h>
#include <gst/video/video.h> #include <gst/video/video.h>
#include "gstvideocrop.h"
#include "gstvideocropelements.h"
#include "gstaspectratiocrop.h" #include "gstaspectratiocrop.h"
#include "gst/glib-compat-private.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 #define gst_aspect_ratio_crop_parent_class parent_class
G_DEFINE_TYPE (GstAspectRatioCrop, gst_aspect_ratio_crop, GST_TYPE_BIN); 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, static void gst_aspect_ratio_crop_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec); const GValue * value, GParamSpec * pspec);

View file

@ -61,12 +61,11 @@
#include <gst/video/video.h> #include <gst/video/video.h>
#include "gstvideocrop.h" #include "gstvideocrop.h"
#include "gstvideocropelements.h"
#include "gstaspectratiocrop.h" #include "gstaspectratiocrop.h"
#include <string.h> #include <string.h>
GST_DEBUG_CATEGORY_STATIC (videocrop_debug);
#define GST_CAT_DEFAULT videocrop_debug
enum enum
{ {
@ -102,6 +101,8 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
#define gst_video_crop_parent_class parent_class #define gst_video_crop_parent_class parent_class
G_DEFINE_TYPE (GstVideoCrop, gst_video_crop, GST_TYPE_VIDEO_FILTER); 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, static void gst_video_crop_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec); 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); 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)

View file

@ -0,0 +1,76 @@
/* GStreamer video frame cropping
* Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
*
* 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 <gst/gst.h>
#include <gst/video/video.h>
#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);
}
}

View file

@ -0,0 +1,34 @@
/* GStreamer video frame cropping
* Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
*
* 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 <gst/video/gstvideofilter.h>
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__ */

View file

@ -0,0 +1,42 @@
/* GStreamer video frame cropping
* Copyright (C) 2006 Tim-Philipp Müller <tim centricular net>
*
* 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)

View file

@ -1,5 +1,5 @@
gstvideocrop = library('gstvideocrop', gstvideocrop = library('gstvideocrop',
'gstvideocrop.c', 'gstaspectratiocrop.c', 'gstvideocrop.c', 'gstaspectratiocrop.c','gstvideocropelement.c', 'gstvideocropplugin.c',
c_args : gst_plugins_good_args, c_args : gst_plugins_good_args,
include_directories : [configinc, libsinc], include_directories : [configinc, libsinc],
dependencies : [gst_dep, gstbase_dep, gstvideo_dep], dependencies : [gst_dep, gstbase_dep, gstvideo_dep],