gst/videobox/gstvideobox.c: Clean up, port to 0.9, use
Original commit message from CVS: 2005-07-05 Andy Wingo <wingo@pobox.com> * gst/videobox/gstvideobox.c: Clean up, port to 0.9, use BaseTransform. * gst/videobox/Makefile.am: Link to base libs, include plugins-base cflags, dist the README. * configure.ac (GST_PLUGIN_ALL, AC_CONFIG_FILES): Add videobox to the build.
This commit is contained in:
parent
77a7c4c8fb
commit
4fc0d55655
11
ChangeLog
11
ChangeLog
@ -1,3 +1,14 @@
|
|||||||
|
2005-07-05 Andy Wingo <wingo@pobox.com>
|
||||||
|
|
||||||
|
* gst/videobox/gstvideobox.c: Clean up, port to 0.9, use
|
||||||
|
BaseTransform.
|
||||||
|
|
||||||
|
* gst/videobox/Makefile.am: Link to base libs, include
|
||||||
|
plugins-base cflags, dist the README.
|
||||||
|
|
||||||
|
* configure.ac (GST_PLUGIN_ALL, AC_CONFIG_FILES): Add videobox to
|
||||||
|
the build.
|
||||||
|
|
||||||
2005-07-04 Wim Taymans <wim@fluendo.com>
|
2005-07-04 Wim Taymans <wim@fluendo.com>
|
||||||
|
|
||||||
* gst/realmedia/rmdemux.c:
|
* gst/realmedia/rmdemux.c:
|
||||||
|
@ -306,6 +306,7 @@ GST_PLUGINS_ALL="\
|
|||||||
rtsp \
|
rtsp \
|
||||||
smpte \
|
smpte \
|
||||||
udp \
|
udp \
|
||||||
|
videobox \
|
||||||
videofilter \
|
videofilter \
|
||||||
"
|
"
|
||||||
|
|
||||||
@ -497,6 +498,7 @@ gst/rtp/Makefile
|
|||||||
gst/rtsp/Makefile
|
gst/rtsp/Makefile
|
||||||
gst/smpte/Makefile
|
gst/smpte/Makefile
|
||||||
gst/udp/Makefile
|
gst/udp/Makefile
|
||||||
|
gst/videobox/Makefile
|
||||||
gst/videofilter/Makefile
|
gst/videofilter/Makefile
|
||||||
sys/Makefile
|
sys/Makefile
|
||||||
ext/Makefile
|
ext/Makefile
|
||||||
|
@ -2,8 +2,10 @@
|
|||||||
plugin_LTLIBRARIES = libgstvideobox.la
|
plugin_LTLIBRARIES = libgstvideobox.la
|
||||||
|
|
||||||
libgstvideobox_la_SOURCES = gstvideobox.c
|
libgstvideobox_la_SOURCES = gstvideobox.c
|
||||||
libgstvideobox_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_LIBS_CFLAGS)
|
libgstvideobox_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS)
|
||||||
libgstvideobox_la_LIBADD =
|
libgstvideobox_la_LIBADD = $(GST_BASE_LIBS)
|
||||||
libgstvideobox_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
libgstvideobox_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
|
||||||
|
|
||||||
noinst_HEADERS =
|
noinst_HEADERS =
|
||||||
|
|
||||||
|
EXTRA_DIST = README
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "config.h"
|
#include "config.h"
|
||||||
#endif
|
#endif
|
||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
|
#include <gst/base/gstbasetransform.h>
|
||||||
#include <gst/video/video.h>
|
#include <gst/video/video.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -49,11 +50,7 @@ GstVideoBoxFill;
|
|||||||
|
|
||||||
struct _GstVideoBox
|
struct _GstVideoBox
|
||||||
{
|
{
|
||||||
GstElement element;
|
GstBaseTransform element;
|
||||||
|
|
||||||
/* pads */
|
|
||||||
GstPad *sinkpad;
|
|
||||||
GstPad *srcpad;
|
|
||||||
|
|
||||||
/* caps */
|
/* caps */
|
||||||
gint in_width, in_height;
|
gint in_width, in_height;
|
||||||
@ -73,7 +70,7 @@ struct _GstVideoBox
|
|||||||
|
|
||||||
struct _GstVideoBoxClass
|
struct _GstVideoBoxClass
|
||||||
{
|
{
|
||||||
GstElementClass parent_class;
|
GstBaseTransformClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* elementfactory information */
|
/* elementfactory information */
|
||||||
@ -94,14 +91,14 @@ GST_ELEMENT_DETAILS ("video box filter",
|
|||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
ARG_0,
|
PROP_0,
|
||||||
ARG_LEFT,
|
PROP_LEFT,
|
||||||
ARG_RIGHT,
|
PROP_RIGHT,
|
||||||
ARG_TOP,
|
PROP_TOP,
|
||||||
ARG_BOTTOM,
|
PROP_BOTTOM,
|
||||||
ARG_FILL_TYPE,
|
PROP_FILL_TYPE,
|
||||||
ARG_ALPHA,
|
PROP_ALPHA,
|
||||||
ARG_BORDER_ALPHA,
|
PROP_BORDER_ALPHA,
|
||||||
/* FILL ME */
|
/* FILL ME */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -120,22 +117,21 @@ GST_STATIC_PAD_TEMPLATE ("sink",
|
|||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
static void gst_video_box_base_init (gpointer g_class);
|
GST_BOILERPLATE (GstVideoBox, gst_video_box, GstBaseTransform,
|
||||||
static void gst_video_box_class_init (GstVideoBoxClass * klass);
|
GST_TYPE_BASE_TRANSFORM);
|
||||||
static void gst_video_box_init (GstVideoBox * video_box);
|
|
||||||
|
|
||||||
static void gst_video_box_set_property (GObject * object, guint prop_id,
|
static void gst_video_box_set_property (GObject * object, guint prop_id,
|
||||||
const GValue * value, GParamSpec * pspec);
|
const GValue * value, GParamSpec * pspec);
|
||||||
static void gst_video_box_get_property (GObject * object, guint prop_id,
|
static void gst_video_box_get_property (GObject * object, guint prop_id,
|
||||||
GValue * value, GParamSpec * pspec);
|
GValue * value, GParamSpec * pspec);
|
||||||
|
|
||||||
static gboolean gst_video_box_sink_setcaps (GstPad * pad, GstCaps * caps);
|
static GstCaps *gst_video_box_transform_caps (GstBaseTransform * trans,
|
||||||
static GstFlowReturn gst_video_box_chain (GstPad * pad, GstBuffer * buffer);
|
GstPad * pad, GstCaps * from);
|
||||||
|
static gboolean gst_video_box_set_caps (GstBaseTransform * trans,
|
||||||
|
GstCaps * in, GstCaps * out);
|
||||||
|
static GstFlowReturn gst_video_box_transform (GstBaseTransform * trans,
|
||||||
|
GstBuffer * in, GstBuffer ** out);
|
||||||
|
|
||||||
static GstElementStateReturn gst_video_box_change_state (GstElement * element);
|
|
||||||
|
|
||||||
|
|
||||||
static GstElementClass *parent_class = NULL;
|
|
||||||
|
|
||||||
#define GST_TYPE_VIDEO_BOX_FILL (gst_video_box_fill_get_type())
|
#define GST_TYPE_VIDEO_BOX_FILL (gst_video_box_fill_get_type())
|
||||||
static GType
|
static GType
|
||||||
@ -156,32 +152,6 @@ gst_video_box_fill_get_type (void)
|
|||||||
return video_box_fill_type;
|
return video_box_fill_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* static guint gst_video_box_signals[LAST_SIGNAL] = { 0 }; */
|
|
||||||
|
|
||||||
GType
|
|
||||||
gst_video_box_get_type (void)
|
|
||||||
{
|
|
||||||
static GType video_box_type = 0;
|
|
||||||
|
|
||||||
if (!video_box_type) {
|
|
||||||
static const GTypeInfo video_box_info = {
|
|
||||||
sizeof (GstVideoBoxClass),
|
|
||||||
gst_video_box_base_init,
|
|
||||||
NULL,
|
|
||||||
(GClassInitFunc) gst_video_box_class_init,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
sizeof (GstVideoBox),
|
|
||||||
0,
|
|
||||||
(GInstanceInitFunc) gst_video_box_init,
|
|
||||||
};
|
|
||||||
|
|
||||||
video_box_type =
|
|
||||||
g_type_register_static (GST_TYPE_ELEMENT, "GstVideoBox",
|
|
||||||
&video_box_info, 0);
|
|
||||||
}
|
|
||||||
return video_box_type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_video_box_base_init (gpointer g_class)
|
gst_video_box_base_init (gpointer g_class)
|
||||||
@ -195,67 +165,55 @@ gst_video_box_base_init (gpointer g_class)
|
|||||||
gst_element_class_add_pad_template (element_class,
|
gst_element_class_add_pad_template (element_class,
|
||||||
gst_static_pad_template_get (&gst_video_box_src_template));
|
gst_static_pad_template_get (&gst_video_box_src_template));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_video_box_class_init (GstVideoBoxClass * klass)
|
gst_video_box_class_init (GstVideoBoxClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class;
|
GObjectClass *gobject_class;
|
||||||
GstElementClass *gstelement_class;
|
GstBaseTransformClass *trans_class;
|
||||||
|
|
||||||
gobject_class = (GObjectClass *) klass;
|
gobject_class = (GObjectClass *) klass;
|
||||||
gstelement_class = (GstElementClass *) klass;
|
trans_class = (GstBaseTransformClass *) klass;
|
||||||
|
|
||||||
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
|
|
||||||
|
|
||||||
gobject_class->set_property = gst_video_box_set_property;
|
gobject_class->set_property = gst_video_box_set_property;
|
||||||
gobject_class->get_property = gst_video_box_get_property;
|
gobject_class->get_property = gst_video_box_get_property;
|
||||||
|
|
||||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_FILL_TYPE,
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FILL_TYPE,
|
||||||
g_param_spec_enum ("fill", "Fill", "How to fill the borders",
|
g_param_spec_enum ("fill", "Fill", "How to fill the borders",
|
||||||
GST_TYPE_VIDEO_BOX_FILL, DEFAULT_FILL_TYPE,
|
GST_TYPE_VIDEO_BOX_FILL, DEFAULT_FILL_TYPE,
|
||||||
(GParamFlags) G_PARAM_READWRITE));
|
(GParamFlags) G_PARAM_READWRITE));
|
||||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_LEFT,
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LEFT,
|
||||||
g_param_spec_int ("left", "Left",
|
g_param_spec_int ("left", "Left",
|
||||||
"Pixels to box at left (<0 = add a border)", G_MININT, G_MAXINT,
|
"Pixels to box at left (<0 = add a border)", G_MININT, G_MAXINT,
|
||||||
DEFAULT_LEFT, G_PARAM_READWRITE));
|
DEFAULT_LEFT, G_PARAM_READWRITE));
|
||||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_RIGHT,
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_RIGHT,
|
||||||
g_param_spec_int ("right", "Right",
|
g_param_spec_int ("right", "Right",
|
||||||
"Pixels to box at right (<0 = add a border)", G_MININT, G_MAXINT,
|
"Pixels to box at right (<0 = add a border)", G_MININT, G_MAXINT,
|
||||||
DEFAULT_RIGHT, G_PARAM_READWRITE));
|
DEFAULT_RIGHT, G_PARAM_READWRITE));
|
||||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_TOP,
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_TOP,
|
||||||
g_param_spec_int ("top", "Top",
|
g_param_spec_int ("top", "Top",
|
||||||
"Pixels to box at top (<0 = add a border)", G_MININT, G_MAXINT,
|
"Pixels to box at top (<0 = add a border)", G_MININT, G_MAXINT,
|
||||||
DEFAULT_TOP, G_PARAM_READWRITE));
|
DEFAULT_TOP, G_PARAM_READWRITE));
|
||||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BOTTOM,
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BOTTOM,
|
||||||
g_param_spec_int ("bottom", "Bottom",
|
g_param_spec_int ("bottom", "Bottom",
|
||||||
"Pixels to box at bottom (<0 = add a border)", G_MININT, G_MAXINT,
|
"Pixels to box at bottom (<0 = add a border)", G_MININT, G_MAXINT,
|
||||||
DEFAULT_BOTTOM, G_PARAM_READWRITE));
|
DEFAULT_BOTTOM, G_PARAM_READWRITE));
|
||||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_ALPHA,
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_ALPHA,
|
||||||
g_param_spec_double ("alpha", "Alpha", "Alpha value picture", 0.0, 1.0,
|
g_param_spec_double ("alpha", "Alpha", "Alpha value picture", 0.0, 1.0,
|
||||||
DEFAULT_ALPHA, G_PARAM_READWRITE));
|
DEFAULT_ALPHA, G_PARAM_READWRITE));
|
||||||
g_object_class_install_property (G_OBJECT_CLASS (klass), ARG_BORDER_ALPHA,
|
g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_BORDER_ALPHA,
|
||||||
g_param_spec_double ("border_alpha", "Border Alpha",
|
g_param_spec_double ("border_alpha", "Border Alpha",
|
||||||
"Alpha value of the border", 0.0, 1.0, DEFAULT_BORDER_ALPHA,
|
"Alpha value of the border", 0.0, 1.0, DEFAULT_BORDER_ALPHA,
|
||||||
G_PARAM_READWRITE));
|
G_PARAM_READWRITE));
|
||||||
|
|
||||||
gstelement_class->change_state = gst_video_box_change_state;
|
trans_class->transform_caps = gst_video_box_transform_caps;
|
||||||
|
trans_class->set_caps = gst_video_box_set_caps;
|
||||||
|
trans_class->transform = gst_video_box_transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_video_box_init (GstVideoBox * video_box)
|
gst_video_box_init (GstVideoBox * video_box)
|
||||||
{
|
{
|
||||||
/* create the sink and src pads */
|
|
||||||
video_box->sinkpad =
|
|
||||||
gst_pad_new_from_template (gst_static_pad_template_get
|
|
||||||
(&gst_video_box_sink_template), "sink");
|
|
||||||
gst_element_add_pad (GST_ELEMENT (video_box), video_box->sinkpad);
|
|
||||||
gst_pad_set_chain_function (video_box->sinkpad, gst_video_box_chain);
|
|
||||||
gst_pad_set_setcaps_function (video_box->sinkpad, gst_video_box_sink_setcaps);
|
|
||||||
|
|
||||||
video_box->srcpad =
|
|
||||||
gst_pad_new_from_template (gst_static_pad_template_get
|
|
||||||
(&gst_video_box_src_template), "src");
|
|
||||||
gst_element_add_pad (GST_ELEMENT (video_box), video_box->srcpad);
|
|
||||||
|
|
||||||
video_box->box_right = DEFAULT_RIGHT;
|
video_box->box_right = DEFAULT_RIGHT;
|
||||||
video_box->box_left = DEFAULT_LEFT;
|
video_box->box_left = DEFAULT_LEFT;
|
||||||
video_box->box_top = DEFAULT_TOP;
|
video_box->box_top = DEFAULT_TOP;
|
||||||
@ -270,15 +228,10 @@ static void
|
|||||||
gst_video_box_set_property (GObject * object, guint prop_id,
|
gst_video_box_set_property (GObject * object, guint prop_id,
|
||||||
const GValue * value, GParamSpec * pspec)
|
const GValue * value, GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
GstVideoBox *video_box;
|
GstVideoBox *video_box = GST_VIDEO_BOX (object);
|
||||||
|
|
||||||
/* it's not null if we got it, but it might not be ours */
|
|
||||||
g_return_if_fail (GST_IS_VIDEO_BOX (object));
|
|
||||||
|
|
||||||
video_box = GST_VIDEO_BOX (object);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case ARG_LEFT:
|
case PROP_LEFT:
|
||||||
video_box->box_left = g_value_get_int (value);
|
video_box->box_left = g_value_get_int (value);
|
||||||
if (video_box->box_left < 0) {
|
if (video_box->box_left < 0) {
|
||||||
video_box->border_left = -video_box->box_left;
|
video_box->border_left = -video_box->box_left;
|
||||||
@ -288,7 +241,7 @@ gst_video_box_set_property (GObject * object, guint prop_id,
|
|||||||
video_box->crop_left = video_box->box_left;
|
video_box->crop_left = video_box->box_left;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ARG_RIGHT:
|
case PROP_RIGHT:
|
||||||
video_box->box_right = g_value_get_int (value);
|
video_box->box_right = g_value_get_int (value);
|
||||||
if (video_box->box_right < 0) {
|
if (video_box->box_right < 0) {
|
||||||
video_box->border_right = -video_box->box_right;
|
video_box->border_right = -video_box->box_right;
|
||||||
@ -298,7 +251,7 @@ gst_video_box_set_property (GObject * object, guint prop_id,
|
|||||||
video_box->crop_right = video_box->box_right;
|
video_box->crop_right = video_box->box_right;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ARG_TOP:
|
case PROP_TOP:
|
||||||
video_box->box_top = g_value_get_int (value);
|
video_box->box_top = g_value_get_int (value);
|
||||||
if (video_box->box_top < 0) {
|
if (video_box->box_top < 0) {
|
||||||
video_box->border_top = -video_box->box_top;
|
video_box->border_top = -video_box->box_top;
|
||||||
@ -308,7 +261,7 @@ gst_video_box_set_property (GObject * object, guint prop_id,
|
|||||||
video_box->crop_top = video_box->box_top;
|
video_box->crop_top = video_box->box_top;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ARG_BOTTOM:
|
case PROP_BOTTOM:
|
||||||
video_box->box_bottom = g_value_get_int (value);
|
video_box->box_bottom = g_value_get_int (value);
|
||||||
if (video_box->box_bottom < 0) {
|
if (video_box->box_bottom < 0) {
|
||||||
video_box->border_bottom = -video_box->box_bottom;
|
video_box->border_bottom = -video_box->box_bottom;
|
||||||
@ -318,13 +271,13 @@ gst_video_box_set_property (GObject * object, guint prop_id,
|
|||||||
video_box->crop_bottom = video_box->box_bottom;
|
video_box->crop_bottom = video_box->box_bottom;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case ARG_FILL_TYPE:
|
case PROP_FILL_TYPE:
|
||||||
video_box->fill_type = g_value_get_enum (value);
|
video_box->fill_type = g_value_get_enum (value);
|
||||||
break;
|
break;
|
||||||
case ARG_ALPHA:
|
case PROP_ALPHA:
|
||||||
video_box->alpha = g_value_get_double (value);
|
video_box->alpha = g_value_get_double (value);
|
||||||
break;
|
break;
|
||||||
case ARG_BORDER_ALPHA:
|
case PROP_BORDER_ALPHA:
|
||||||
video_box->border_alpha = g_value_get_double (value);
|
video_box->border_alpha = g_value_get_double (value);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -336,33 +289,28 @@ static void
|
|||||||
gst_video_box_get_property (GObject * object, guint prop_id, GValue * value,
|
gst_video_box_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
GParamSpec * pspec)
|
GParamSpec * pspec)
|
||||||
{
|
{
|
||||||
GstVideoBox *video_box;
|
GstVideoBox *video_box = GST_VIDEO_BOX (object);
|
||||||
|
|
||||||
/* it's not null if we got it, but it might not be ours */
|
|
||||||
g_return_if_fail (GST_IS_VIDEO_BOX (object));
|
|
||||||
|
|
||||||
video_box = GST_VIDEO_BOX (object);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case ARG_LEFT:
|
case PROP_LEFT:
|
||||||
g_value_set_int (value, video_box->box_left);
|
g_value_set_int (value, video_box->box_left);
|
||||||
break;
|
break;
|
||||||
case ARG_RIGHT:
|
case PROP_RIGHT:
|
||||||
g_value_set_int (value, video_box->box_right);
|
g_value_set_int (value, video_box->box_right);
|
||||||
break;
|
break;
|
||||||
case ARG_TOP:
|
case PROP_TOP:
|
||||||
g_value_set_int (value, video_box->box_top);
|
g_value_set_int (value, video_box->box_top);
|
||||||
break;
|
break;
|
||||||
case ARG_BOTTOM:
|
case PROP_BOTTOM:
|
||||||
g_value_set_int (value, video_box->box_bottom);
|
g_value_set_int (value, video_box->box_bottom);
|
||||||
break;
|
break;
|
||||||
case ARG_FILL_TYPE:
|
case PROP_FILL_TYPE:
|
||||||
g_value_set_enum (value, video_box->fill_type);
|
g_value_set_enum (value, video_box->fill_type);
|
||||||
break;
|
break;
|
||||||
case ARG_ALPHA:
|
case PROP_ALPHA:
|
||||||
g_value_set_double (value, video_box->alpha);
|
g_value_set_double (value, video_box->alpha);
|
||||||
break;
|
break;
|
||||||
case ARG_BORDER_ALPHA:
|
case PROP_BORDER_ALPHA:
|
||||||
g_value_set_double (value, video_box->border_alpha);
|
g_value_set_double (value, video_box->border_alpha);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -371,19 +319,49 @@ gst_video_box_get_property (GObject * object, guint prop_id, GValue * value,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GstCaps *
|
||||||
|
gst_video_box_transform_caps (GstBaseTransform * trans, GstPad * pad,
|
||||||
|
GstCaps * from)
|
||||||
|
{
|
||||||
|
GstVideoBox *video_box;
|
||||||
|
GstCaps *to;
|
||||||
|
GstStructure *structure;
|
||||||
|
gint direction, i, tmp;
|
||||||
|
|
||||||
|
video_box = GST_VIDEO_BOX (trans);
|
||||||
|
to = gst_caps_copy (from);
|
||||||
|
direction = (pad == trans->sinkpad) ? 1 : -1;
|
||||||
|
|
||||||
|
for (i = 0; i < gst_caps_get_size (to); i++) {
|
||||||
|
structure = gst_caps_get_structure (to, i);
|
||||||
|
if (gst_structure_get_int (structure, "width", &tmp))
|
||||||
|
gst_structure_set (structure, "width", G_TYPE_INT,
|
||||||
|
tmp + direction * (video_box->box_left + video_box->box_right), NULL);
|
||||||
|
if (gst_structure_get_int (structure, "height", &tmp))
|
||||||
|
gst_structure_set (structure, "height", G_TYPE_INT,
|
||||||
|
tmp + direction * (video_box->box_top + video_box->box_bottom), NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return to;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_video_box_sink_setcaps (GstPad * pad, GstCaps * caps)
|
gst_video_box_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out)
|
||||||
{
|
{
|
||||||
GstVideoBox *video_box;
|
GstVideoBox *video_box;
|
||||||
GstStructure *structure;
|
GstStructure *structure;
|
||||||
gboolean ret;
|
gboolean ret;
|
||||||
|
|
||||||
video_box = GST_VIDEO_BOX (GST_PAD_PARENT (pad));
|
video_box = GST_VIDEO_BOX (trans);
|
||||||
structure = gst_caps_get_structure (caps, 0);
|
|
||||||
|
|
||||||
|
structure = gst_caps_get_structure (in, 0);
|
||||||
ret = gst_structure_get_int (structure, "width", &video_box->in_width);
|
ret = gst_structure_get_int (structure, "width", &video_box->in_width);
|
||||||
ret &= gst_structure_get_int (structure, "height", &video_box->in_height);
|
ret &= gst_structure_get_int (structure, "height", &video_box->in_height);
|
||||||
|
|
||||||
|
structure = gst_caps_get_structure (out, 0);
|
||||||
|
ret &= gst_structure_get_int (structure, "width", &video_box->out_width);
|
||||||
|
ret &= gst_structure_get_int (structure, "height", &video_box->out_height);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -601,110 +579,43 @@ gst_video_box_ayuv (GstVideoBox * video_box, guint8 * src, guint8 * dest)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_video_box_chain (GstPad * pad, GstBuffer * buffer)
|
gst_video_box_transform (GstBaseTransform * trans, GstBuffer * in,
|
||||||
|
GstBuffer ** out)
|
||||||
{
|
{
|
||||||
GstVideoBox *video_box;
|
GstVideoBox *video_box;
|
||||||
GstBuffer *outbuf;
|
|
||||||
gint new_width, new_height;
|
|
||||||
GstFlowReturn ret;
|
GstFlowReturn ret;
|
||||||
|
|
||||||
video_box = GST_VIDEO_BOX (gst_pad_get_parent (pad));
|
video_box = GST_VIDEO_BOX (trans);
|
||||||
|
|
||||||
new_width =
|
|
||||||
video_box->in_width - (video_box->box_left + video_box->box_right);
|
|
||||||
new_height =
|
|
||||||
video_box->in_height - (video_box->box_top + video_box->box_bottom);
|
|
||||||
|
|
||||||
if (new_width != video_box->out_width ||
|
|
||||||
new_height != video_box->out_height ||
|
|
||||||
!GST_PAD_CAPS (video_box->srcpad)) {
|
|
||||||
GstCaps *newcaps;
|
|
||||||
|
|
||||||
newcaps = gst_caps_copy (gst_pad_get_negotiated_caps (video_box->sinkpad));
|
|
||||||
|
|
||||||
video_box->use_alpha = TRUE;
|
|
||||||
|
|
||||||
/* try AYUV first */
|
|
||||||
gst_caps_set_simple (newcaps,
|
|
||||||
"format", GST_TYPE_FOURCC, GST_STR_FOURCC ("AYUV"),
|
|
||||||
"width", G_TYPE_INT, new_width, "height", G_TYPE_INT, new_height, NULL);
|
|
||||||
|
|
||||||
if (GST_PAD_LINK_FAILED (gst_pad_try_set_caps (video_box->srcpad, newcaps))) {
|
|
||||||
video_box->use_alpha = FALSE;
|
|
||||||
newcaps =
|
|
||||||
gst_caps_copy (gst_pad_get_negotiated_caps (video_box->sinkpad));
|
|
||||||
gst_caps_set_simple (newcaps, "format", GST_TYPE_FOURCC,
|
|
||||||
GST_STR_FOURCC ("I420"), "width", G_TYPE_INT, new_width, "height",
|
|
||||||
G_TYPE_INT, new_height, NULL);
|
|
||||||
|
|
||||||
if (GST_PAD_LINK_FAILED (gst_pad_try_set_caps (video_box->srcpad,
|
|
||||||
newcaps))) {
|
|
||||||
GST_ELEMENT_ERROR (video_box, CORE, NEGOTIATION, (NULL), (NULL));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
video_box->out_width = new_width;
|
|
||||||
video_box->out_height = new_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (video_box->use_alpha) {
|
if (video_box->use_alpha) {
|
||||||
ret = gst_pad_alloc_buffer (video_box->srcpad,
|
ret = gst_pad_alloc_buffer (trans->srcpad,
|
||||||
GST_BUFFER_OFFSET_NONE, new_width * new_height * 4,
|
GST_BUFFER_OFFSET_NONE,
|
||||||
GST_RPAD_CAPS (video_box->srcpad), &outbuf);
|
video_box->out_height * video_box->out_height * 4,
|
||||||
|
GST_PAD_CAPS (trans->srcpad), out);
|
||||||
if (ret != GST_FLOW_OK)
|
if (ret != GST_FLOW_OK)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
gst_video_box_ayuv (video_box,
|
gst_video_box_ayuv (video_box,
|
||||||
GST_BUFFER_DATA (buffer), GST_BUFFER_DATA (outbuf));
|
GST_BUFFER_DATA (in), GST_BUFFER_DATA (*out));
|
||||||
} else {
|
} else {
|
||||||
ret = gst_pad_alloc_buffer (video_box->srcpad,
|
ret = gst_pad_alloc_buffer (trans->srcpad,
|
||||||
GST_BUFFER_OFFSET_NONE, GST_VIDEO_I420_SIZE (new_width, new_height),
|
GST_BUFFER_OFFSET_NONE,
|
||||||
GST_RPAD_CAPS (video_box->srcpad), &outbuf);
|
GST_VIDEO_I420_SIZE (video_box->out_width, video_box->out_height),
|
||||||
|
GST_PAD_CAPS (trans->srcpad), out);
|
||||||
if (ret != GST_FLOW_OK)
|
if (ret != GST_FLOW_OK)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
gst_video_box_i420 (video_box,
|
gst_video_box_i420 (video_box,
|
||||||
GST_BUFFER_DATA (buffer), GST_BUFFER_DATA (outbuf));
|
GST_BUFFER_DATA (in), GST_BUFFER_DATA (*out));
|
||||||
}
|
}
|
||||||
GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (buffer);
|
|
||||||
GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (buffer);
|
|
||||||
|
|
||||||
ret = gst_pad_push (video_box->srcpad, outbuf);
|
gst_buffer_stamp (*out, in);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
gst_buffer_unref (buffer);
|
gst_buffer_unref (in);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstElementStateReturn
|
|
||||||
gst_video_box_change_state (GstElement * element)
|
|
||||||
{
|
|
||||||
GstVideoBox *video_box;
|
|
||||||
|
|
||||||
video_box = GST_VIDEO_BOX (element);
|
|
||||||
|
|
||||||
switch (GST_STATE_TRANSITION (element)) {
|
|
||||||
case GST_STATE_NULL_TO_READY:
|
|
||||||
break;
|
|
||||||
case GST_STATE_READY_TO_PAUSED:
|
|
||||||
break;
|
|
||||||
case GST_STATE_PAUSED_TO_PLAYING:
|
|
||||||
break;
|
|
||||||
case GST_STATE_PLAYING_TO_PAUSED:
|
|
||||||
break;
|
|
||||||
case GST_STATE_PAUSED_TO_READY:
|
|
||||||
break;
|
|
||||||
case GST_STATE_READY_TO_NULL:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
parent_class->change_state (element);
|
|
||||||
|
|
||||||
return GST_STATE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
plugin_init (GstPlugin * plugin)
|
plugin_init (GstPlugin * plugin)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user