summaryrefslogtreecommitdiff
path: root/gst/alpha/gstalpha.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/alpha/gstalpha.c')
-rw-r--r--gst/alpha/gstalpha.c121
1 files changed, 37 insertions, 84 deletions
diff --git a/gst/alpha/gstalpha.c b/gst/alpha/gstalpha.c
index a97c6812a..001f383ed 100644
--- a/gst/alpha/gstalpha.c
+++ b/gst/alpha/gstalpha.c
@@ -156,17 +156,17 @@ GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("{ AYUV, ARGB, BGRA, ABGR, RGBA }"));
g_static_mutex_unlock (&alpha->lock); \
} G_STMT_END
-static gboolean gst_alpha_get_unit_size (GstBaseTransform * btrans,
- GstCaps * caps, gsize * size);
static GstCaps *gst_alpha_transform_caps (GstBaseTransform * btrans,
GstPadDirection direction, GstCaps * caps, GstCaps * filter);
-static gboolean gst_alpha_set_caps (GstBaseTransform * btrans,
- GstCaps * incaps, GstCaps * outcaps);
-static GstFlowReturn gst_alpha_transform (GstBaseTransform * btrans,
- GstBuffer * in, GstBuffer * out);
static void gst_alpha_before_transform (GstBaseTransform * btrans,
GstBuffer * buf);
+static gboolean gst_alpha_set_info (GstVideoFilter * filter,
+ GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps,
+ GstVideoInfo * out_info);
+static GstFlowReturn gst_alpha_transform_frame (GstVideoFilter * filter,
+ GstVideoFrame * in_frame, GstVideoFrame * out_frame);
+
static void gst_alpha_init_params (GstAlpha * alpha);
static gboolean gst_alpha_set_process_function (GstAlpha * alpha);
@@ -204,6 +204,7 @@ gst_alpha_class_init (GstAlphaClass * klass)
GObjectClass *gobject_class = (GObjectClass *) klass;
GstElementClass *gstelement_class = (GstElementClass *) klass;
GstBaseTransformClass *btrans_class = (GstBaseTransformClass *) klass;
+ GstVideoFilterClass *vfilter_class = (GstVideoFilterClass *) klass;
GST_DEBUG_CATEGORY_INIT (gst_alpha_debug, "alpha", 0,
"alpha - Element for adding alpha channel to streams");
@@ -269,12 +270,13 @@ gst_alpha_class_init (GstAlphaClass * klass)
gst_element_class_add_pad_template (gstelement_class,
gst_static_pad_template_get (&gst_alpha_src_template));
- btrans_class->transform = GST_DEBUG_FUNCPTR (gst_alpha_transform);
btrans_class->before_transform =
GST_DEBUG_FUNCPTR (gst_alpha_before_transform);
- btrans_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_alpha_get_unit_size);
btrans_class->transform_caps = GST_DEBUG_FUNCPTR (gst_alpha_transform_caps);
- btrans_class->set_caps = GST_DEBUG_FUNCPTR (gst_alpha_set_caps);
+
+ vfilter_class->set_info = GST_DEBUG_FUNCPTR (gst_alpha_set_info);
+ vfilter_class->transform_frame =
+ GST_DEBUG_FUNCPTR (gst_alpha_transform_frame);
}
static void
@@ -434,25 +436,6 @@ gst_alpha_get_property (GObject * object, guint prop_id, GValue * value,
}
}
-static gboolean
-gst_alpha_get_unit_size (GstBaseTransform * btrans,
- GstCaps * caps, gsize * size)
-{
- GstVideoInfo info;
-
- if (!gst_video_info_from_caps (&info, caps))
- return FALSE;
-
- *size = info.size;
-
- GST_DEBUG_OBJECT (btrans,
- "unit size = %" G_GSIZE_FORMAT " for format %s w %d height %d", *size,
- GST_VIDEO_INFO_NAME (&info), GST_VIDEO_INFO_WIDTH (&info),
- GST_VIDEO_INFO_HEIGHT (&info));
-
- return TRUE;
-}
-
static GstCaps *
gst_alpha_transform_caps (GstBaseTransform * btrans,
GstPadDirection direction, GstCaps * caps, GstCaps * filter)
@@ -518,34 +501,28 @@ gst_alpha_transform_caps (GstBaseTransform * btrans,
}
static gboolean
-gst_alpha_set_caps (GstBaseTransform * btrans,
- GstCaps * incaps, GstCaps * outcaps)
+gst_alpha_set_info (GstVideoFilter * filter,
+ GstCaps * incaps, GstVideoInfo * in_info, GstCaps * outcaps,
+ GstVideoInfo * out_info)
{
- GstAlpha *alpha = GST_ALPHA (btrans);
- GstVideoInfo in_info, out_info;
+ GstAlpha *alpha = GST_ALPHA (filter);
gboolean passthrough;
- if (!gst_video_info_from_caps (&in_info, incaps) ||
- !gst_video_info_from_caps (&out_info, outcaps))
- goto invalid_format;
-
GST_ALPHA_LOCK (alpha);
- alpha->in_sdtv = in_info.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT601;
- alpha->out_sdtv = out_info.colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT601;
+ alpha->in_sdtv = in_info->colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT601;
+ alpha->out_sdtv = out_info->colorimetry.matrix = GST_VIDEO_COLOR_MATRIX_BT601;
passthrough = alpha->prefer_passthrough &&
- GST_VIDEO_INFO_FORMAT (&in_info) == GST_VIDEO_INFO_FORMAT (&out_info)
+ GST_VIDEO_INFO_FORMAT (in_info) == GST_VIDEO_INFO_FORMAT (out_info)
&& alpha->in_sdtv == alpha->out_sdtv && alpha->method == ALPHA_METHOD_SET
&& alpha->alpha == 1.0;
GST_DEBUG_OBJECT (alpha,
"Setting caps %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT
" (passthrough: %d)", incaps, outcaps, passthrough);
- gst_base_transform_set_passthrough (btrans, passthrough);
-
- alpha->in_info = in_info;
- alpha->out_info = out_info;
+ gst_base_transform_set_passthrough (GST_BASE_TRANSFORM_CAST (filter),
+ passthrough);
if (!gst_alpha_set_process_function (alpha) && !passthrough)
goto no_process;
@@ -557,13 +534,6 @@ gst_alpha_set_caps (GstBaseTransform * btrans,
return TRUE;
/* ERRORS */
-invalid_format:
- {
- GST_WARNING_OBJECT (alpha,
- "Failed to parse caps %" GST_PTR_FORMAT " -> %" GST_PTR_FORMAT, incaps,
- outcaps);
- return FALSE;
- }
no_process:
{
GST_WARNING_OBJECT (alpha,
@@ -2325,8 +2295,8 @@ gst_alpha_init_params (GstAlpha * alpha)
const GstVideoFormatInfo *in_info, *out_info;
const gint *matrix;
- in_info = alpha->in_info.finfo;
- out_info = alpha->out_info.finfo;
+ in_info = GST_VIDEO_FILTER (alpha)->in_info.finfo;
+ out_info = GST_VIDEO_FILTER (alpha)->out_info.finfo;
/* RGB->RGB: convert to SDTV YUV, chroma keying, convert back
* YUV->RGB: chroma keying, convert to RGB
@@ -2390,13 +2360,18 @@ gst_alpha_init_params (GstAlpha * alpha)
static gboolean
gst_alpha_set_process_function (GstAlpha * alpha)
{
+ GstVideoInfo *in_info, *out_info;
+
alpha->process = NULL;
+ in_info = &GST_VIDEO_FILTER_CAST (alpha)->in_info;
+ out_info = &GST_VIDEO_FILTER_CAST (alpha)->out_info;
+
switch (alpha->method) {
case ALPHA_METHOD_SET:
- switch (GST_VIDEO_INFO_FORMAT (&alpha->out_info)) {
+ switch (GST_VIDEO_INFO_FORMAT (out_info)) {
case GST_VIDEO_FORMAT_AYUV:
- switch (GST_VIDEO_INFO_FORMAT (&alpha->in_info)) {
+ switch (GST_VIDEO_INFO_FORMAT (in_info)) {
case GST_VIDEO_FORMAT_AYUV:
alpha->process = gst_alpha_set_ayuv_ayuv;
break;
@@ -2434,7 +2409,7 @@ gst_alpha_set_process_function (GstAlpha * alpha)
case GST_VIDEO_FORMAT_ABGR:
case GST_VIDEO_FORMAT_RGBA:
case GST_VIDEO_FORMAT_BGRA:
- switch (GST_VIDEO_INFO_FORMAT (&alpha->in_info)) {
+ switch (GST_VIDEO_INFO_FORMAT (in_info)) {
case GST_VIDEO_FORMAT_AYUV:
alpha->process = gst_alpha_set_ayuv_argb;
break;
@@ -2476,9 +2451,9 @@ gst_alpha_set_process_function (GstAlpha * alpha)
case ALPHA_METHOD_GREEN:
case ALPHA_METHOD_BLUE:
case ALPHA_METHOD_CUSTOM:
- switch (GST_VIDEO_INFO_FORMAT (&alpha->out_info)) {
+ switch (GST_VIDEO_INFO_FORMAT (out_info)) {
case GST_VIDEO_FORMAT_AYUV:
- switch (GST_VIDEO_INFO_FORMAT (&alpha->in_info)) {
+ switch (GST_VIDEO_INFO_FORMAT (in_info)) {
case GST_VIDEO_FORMAT_AYUV:
alpha->process = gst_alpha_chroma_key_ayuv_ayuv;
break;
@@ -2516,7 +2491,7 @@ gst_alpha_set_process_function (GstAlpha * alpha)
case GST_VIDEO_FORMAT_ABGR:
case GST_VIDEO_FORMAT_RGBA:
case GST_VIDEO_FORMAT_BGRA:
- switch (GST_VIDEO_INFO_FORMAT (&alpha->in_info)) {
+ switch (GST_VIDEO_INFO_FORMAT (in_info)) {
case GST_VIDEO_FORMAT_AYUV:
alpha->process = gst_alpha_chroma_key_ayuv_argb;
break;
@@ -2575,26 +2550,17 @@ gst_alpha_before_transform (GstBaseTransform * btrans, GstBuffer * buf)
}
static GstFlowReturn
-gst_alpha_transform (GstBaseTransform * btrans, GstBuffer * in, GstBuffer * out)
+gst_alpha_transform_frame (GstVideoFilter * filter, GstVideoFrame * in_frame,
+ GstVideoFrame * out_frame)
{
- GstAlpha *alpha = GST_ALPHA (btrans);
- GstVideoFrame in_frame, out_frame;
+ GstAlpha *alpha = GST_ALPHA (filter);
GST_ALPHA_LOCK (alpha);
if (G_UNLIKELY (!alpha->process))
goto not_negotiated;
- if (!gst_video_frame_map (&in_frame, &alpha->in_info, in, GST_MAP_READ))
- goto invalid_in;
-
- if (!gst_video_frame_map (&out_frame, &alpha->out_info, out, GST_MAP_WRITE))
- goto invalid_out;
-
- alpha->process (&in_frame, &out_frame, alpha);
-
- gst_video_frame_unmap (&out_frame);
- gst_video_frame_unmap (&in_frame);
+ alpha->process (in_frame, out_frame, alpha);
GST_ALPHA_UNLOCK (alpha);
@@ -2607,19 +2573,6 @@ not_negotiated:
GST_ALPHA_UNLOCK (alpha);
return GST_FLOW_NOT_NEGOTIATED;
}
-invalid_in:
- {
- GST_ERROR_OBJECT (alpha, "Invalid input frame");
- GST_ALPHA_UNLOCK (alpha);
- return GST_FLOW_OK;
- }
-invalid_out:
- {
- GST_ERROR_OBJECT (alpha, "Invalid output frame");
- gst_video_frame_unmap (&in_frame);
- GST_ALPHA_UNLOCK (alpha);
- return GST_FLOW_OK;
- }
}
static gboolean