summaryrefslogtreecommitdiffstats
path: root/gst/videobox
diff options
context:
space:
mode:
authorJulien Moutte <julien@moutte.net>2005-10-26 17:23:06 +0000
committerJulien Moutte <julien@moutte.net>2005-10-26 17:23:06 +0000
commitb1f244b5a6393dced6d85946019b6aa168065655 (patch)
tree77ff6589aae2b34617af90a993316b8e0574139b /gst/videobox
parentf7d6a2f13101e64620815f77f6ba97c8781b5f11 (diff)
gst/videobox/Makefile.am: Use liboil.
Original commit message from CVS: 2005-10-26 Julien MOUTTE <julien@moutte.net> * gst/videobox/Makefile.am: Use liboil. * gst/videobox/gstvideobox.c: (gst_video_box_class_init), (gst_video_box_set_property), (gst_video_box_transform_caps), (gst_video_box_set_caps), (gst_video_box_get_unit_size), (gst_video_box_ayuv): Lot of optimization in AYUV rendering using liboil. Will dot the same to I420 border generation tomorrow.
Diffstat (limited to 'gst/videobox')
-rw-r--r--gst/videobox/Makefile.am6
-rw-r--r--gst/videobox/gstvideobox.c60
2 files changed, 40 insertions, 26 deletions
diff --git a/gst/videobox/Makefile.am b/gst/videobox/Makefile.am
index a077cf16..2afdc4d7 100644
--- a/gst/videobox/Makefile.am
+++ b/gst/videobox/Makefile.am
@@ -1,8 +1,10 @@
plugin_LTLIBRARIES = libgstvideobox.la
libgstvideobox_la_SOURCES = gstvideobox.c
-libgstvideobox_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS)
-libgstvideobox_la_LIBADD = $(GST_BASE_LIBS)
+libgstvideobox_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
+ $(LIBOIL_CFLAGS)
+libgstvideobox_la_LIBADD = $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \
+ $(LIBOIL_LIBS)
libgstvideobox_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
EXTRA_DIST = README
diff --git a/gst/videobox/gstvideobox.c b/gst/videobox/gstvideobox.c
index a1c2acc0..f76310db 100644
--- a/gst/videobox/gstvideobox.c
+++ b/gst/videobox/gstvideobox.c
@@ -24,6 +24,7 @@
#include <gst/base/gstbasetransform.h>
#include <gst/video/video.h>
+#include <liboil/liboil.h>
#include <string.h>
GST_DEBUG_CATEGORY (videobox_debug);
@@ -296,12 +297,6 @@ gst_video_box_set_property (GObject * object, guint prop_id,
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
-
- if (video_box->box_left == 0 && video_box->box_right == 0 &&
- video_box->box_top == 0 && video_box->box_bottom == 0)
- gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (video_box), TRUE);
- else
- gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (video_box), FALSE);
}
static void
@@ -381,8 +376,8 @@ gst_video_box_transform_caps (GstBaseTransform * trans,
g_value_unset (&list_value);
- GST_DEBUG_OBJECT (video_box, "transformed %" GST_PTR_FORMAT
- " to %" GST_PTR_FORMAT, from, to);
+ GST_DEBUG_OBJECT (video_box, "direction %d, transformed %" GST_PTR_FORMAT
+ " to %" GST_PTR_FORMAT, direction, from, to);
return to;
}
@@ -406,7 +401,19 @@ gst_video_box_set_caps (GstBaseTransform * trans, GstCaps * in, GstCaps * out)
ret &= gst_structure_get_int (structure, "height", &video_box->out_height);
ret &= gst_structure_get_fourcc (structure, "format", &fourcc);
- video_box->use_alpha = fourcc == GST_STR_FOURCC ("AYUV");
+ if (fourcc == GST_STR_FOURCC ("AYUV")) {
+ video_box->use_alpha = TRUE;
+ } else {
+ if (video_box->box_left == 0 && video_box->box_right == 0 &&
+ video_box->box_top == 0 && video_box->box_bottom == 0) {
+ gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (video_box), TRUE);
+ GST_LOG ("we are using passthrough");
+ } else {
+ gst_base_transform_set_passthrough (GST_BASE_TRANSFORM (video_box),
+ FALSE);
+ GST_LOG ("we are not using passthrough");
+ }
+ }
return ret;
}
@@ -555,7 +562,6 @@ gst_video_box_i420 (GstVideoBox * video_box, guint8 * src, guint8 * dest)
/* Note the source image is always I420, we
* are converting to AYUV on the fly here */
-
static void
gst_video_box_ayuv (GstVideoBox * video_box, guint8 * src, guint8 * dest)
{
@@ -608,24 +614,28 @@ gst_video_box_ayuv (GstVideoBox * video_box, guint8 * src, guint8 * dest)
colorV);
/* top border */
- for (i = 0; i < bt; i++) {
- for (j = 0; j < out_width; j++) {
- *destp++ = ayuv;
- }
+ if (bt) {
+ size_t nb_pixels = bt * out_width;
+
+ oil_splat_u32_ns (destp, &ayuv, nb_pixels);
+ destp += nb_pixels;
}
for (i = 0; i < crop_height; i++) {
/* left border */
- for (j = 0; j < bl; j++) {
- *destp++ = ayuv;
+ if (bl) {
+ oil_splat_u32_ns (destp, &ayuv, bl);
+ destp += bl;
}
dest = (guint8 *) destp;
/* center */
+ /* We can splat the alpha channel for the whole line */
+ oil_splat_u8 (dest, 4, &i_alpha, crop_width);
for (j = 0; j < crop_width2; j++) {
- *dest++ = i_alpha;
+ dest++;
*dest++ = *srcY++;
*dest++ = *srcU;
*dest++ = *srcV;
- *dest++ = i_alpha;
+ dest++;
*dest++ = *srcY++;
*dest++ = *srcU++;
*dest++ = *srcV++;
@@ -641,15 +651,17 @@ gst_video_box_ayuv (GstVideoBox * video_box, guint8 * src, guint8 * dest)
destp = (guint32 *) dest;
/* right border */
- for (j = 0; j < br; j++) {
- *destp++ = ayuv;
+ if (br) {
+ oil_splat_u32_ns (destp, &ayuv, br);
+ destp += br;
}
}
/* bottom border */
- for (i = 0; i < bb; i++) {
- for (j = 0; j < out_width; j++) {
- *destp++ = ayuv;
- }
+ if (bb) {
+ size_t nb_pixels = bb * out_width;
+
+ oil_splat_u32_ns (destp, &ayuv, nb_pixels);
+ destp += nb_pixels;
}
}