summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2010-04-24 16:28:12 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2010-04-29 19:28:24 +0200
commiteeb5a23483167ca6ec5b81ef553d71c4134a4283 (patch)
tree2a2633292d93f25ccdf0a6d31472f2871fb6c272
parent4ca4ac3f03e6d902b80e572da8098b08ba157c1f (diff)
deinterlace: Add planar YUV support to all other simple methods
-rw-r--r--gst/deinterlace/tvtime/linear.c90
-rw-r--r--gst/deinterlace/tvtime/linearblend.c120
-rw-r--r--gst/deinterlace/tvtime/scalerbob.c27
-rw-r--r--gst/deinterlace/tvtime/weave.c52
-rw-r--r--gst/deinterlace/tvtime/weavebff.c66
-rw-r--r--gst/deinterlace/tvtime/weavetff.c66
6 files changed, 421 insertions, 0 deletions
diff --git a/gst/deinterlace/tvtime/linear.c b/gst/deinterlace/tvtime/linear.c
index e17e29e57..1a1885021 100644
--- a/gst/deinterlace/tvtime/linear.c
+++ b/gst/deinterlace/tvtime/linear.c
@@ -61,6 +61,30 @@ deinterlace_scanline_linear_packed_c (GstDeinterlaceSimpleMethod * self,
self->parent.row_stride[0]);
}
+static void
+deinterlace_scanline_linear_planar_y_c (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_c (self, out, scanlines->t0, scanlines->b0,
+ self->parent.row_stride[0]);
+}
+
+static void
+deinterlace_scanline_linear_planar_u_c (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_c (self, out, scanlines->t0, scanlines->b0,
+ self->parent.row_stride[1]);
+}
+
+static void
+deinterlace_scanline_linear_planar_v_c (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_c (self, out, scanlines->t0, scanlines->b0,
+ self->parent.row_stride[2]);
+}
+
#ifdef BUILD_X86_ASM
#include "mmx.h"
static void
@@ -140,6 +164,30 @@ deinterlace_scanline_linear_packed_mmx (GstDeinterlaceSimpleMethod * self,
self->parent.row_stride[0]);
}
+static void
+deinterlace_scanline_linear_planar_y_mmx (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_mmx (self, out, scanlines->t0, scanlines->b0,
+ self->parent.row_stride[0]);
+}
+
+static void
+deinterlace_scanline_linear_planar_u_mmx (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_mmx (self, out, scanlines->t0, scanlines->b0,
+ self->parent.row_stride[1]);
+}
+
+static void
+deinterlace_scanline_linear_planar_v_mmx (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_mmx (self, out, scanlines->t0, scanlines->b0,
+ self->parent.row_stride[2]);
+}
+
#include "sse.h"
static void
deinterlace_scanline_linear_mmxext (GstDeinterlaceSimpleMethod * self,
@@ -197,6 +245,30 @@ deinterlace_scanline_linear_packed_mmxext (GstDeinterlaceSimpleMethod * self,
self->parent.row_stride[0]);
}
+static void
+deinterlace_scanline_linear_planar_y_mmxext (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_mmxext (self, out, scanlines->t0, scanlines->b0,
+ self->parent.row_stride[0]);
+}
+
+static void
+deinterlace_scanline_linear_planar_u_mmxext (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_mmxext (self, out, scanlines->t0, scanlines->b0,
+ self->parent.row_stride[1]);
+}
+
+static void
+deinterlace_scanline_linear_planar_v_mmxext (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_mmxext (self, out, scanlines->t0, scanlines->b0,
+ self->parent.row_stride[2]);
+}
+
#endif
G_DEFINE_TYPE (GstDeinterlaceMethodLinear, gst_deinterlace_method_linear,
@@ -220,6 +292,12 @@ gst_deinterlace_method_linear_class_init (GstDeinterlaceMethodLinearClass *
dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_linear_packed_c;
dism_class->interpolate_scanline_yvyu = deinterlace_scanline_linear_packed_c;
+ dism_class->interpolate_scanline_planar_y =
+ deinterlace_scanline_linear_planar_y_c;
+ dism_class->interpolate_scanline_planar_u =
+ deinterlace_scanline_linear_planar_u_c;
+ dism_class->interpolate_scanline_planar_v =
+ deinterlace_scanline_linear_planar_v_c;
#ifdef BUILD_X86_ASM
if (cpu_flags & OIL_IMPL_FLAG_MMXEXT) {
@@ -227,11 +305,23 @@ gst_deinterlace_method_linear_class_init (GstDeinterlaceMethodLinearClass *
deinterlace_scanline_linear_packed_mmxext;
dism_class->interpolate_scanline_yvyu =
deinterlace_scanline_linear_packed_mmxext;
+ dism_class->interpolate_scanline_planar_y =
+ deinterlace_scanline_linear_planar_y_mmxext;
+ dism_class->interpolate_scanline_planar_u =
+ deinterlace_scanline_linear_planar_u_mmxext;
+ dism_class->interpolate_scanline_planar_v =
+ deinterlace_scanline_linear_planar_v_mmxext;
} else if (cpu_flags & OIL_IMPL_FLAG_MMX) {
dism_class->interpolate_scanline_yuy2 =
deinterlace_scanline_linear_packed_mmx;
dism_class->interpolate_scanline_yvyu =
deinterlace_scanline_linear_packed_mmx;
+ dism_class->interpolate_scanline_planar_y =
+ deinterlace_scanline_linear_planar_y_mmx;
+ dism_class->interpolate_scanline_planar_u =
+ deinterlace_scanline_linear_planar_u_mmx;
+ dism_class->interpolate_scanline_planar_v =
+ deinterlace_scanline_linear_planar_v_mmx;
}
#endif
}
diff --git a/gst/deinterlace/tvtime/linearblend.c b/gst/deinterlace/tvtime/linearblend.c
index 8e2a76399..8c9b10ee6 100644
--- a/gst/deinterlace/tvtime/linearblend.c
+++ b/gst/deinterlace/tvtime/linearblend.c
@@ -65,6 +65,30 @@ deinterlace_scanline_linear_blend_packed_c (GstDeinterlaceSimpleMethod * self,
scanlines->m1, self->parent.row_stride[0]);
}
+static void
+deinterlace_scanline_linear_blend_planar_y_c (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
+ scanlines->m1, self->parent.row_stride[0]);
+}
+
+static void
+deinterlace_scanline_linear_blend_planar_u_c (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
+ scanlines->m1, self->parent.row_stride[1]);
+}
+
+static void
+deinterlace_scanline_linear_blend_planar_v_c (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_blend_c (self, out, scanlines->t0, scanlines->b0,
+ scanlines->m1, self->parent.row_stride[2]);
+}
+
static inline void
deinterlace_scanline_linear_blend2_c (GstDeinterlaceSimpleMethod * self,
guint8 * out, const guint8 * m0, const guint8 * t1, const guint8 * b1,
@@ -83,6 +107,30 @@ deinterlace_scanline_linear_blend2_packed_c (GstDeinterlaceSimpleMethod * self,
scanlines->b1, self->parent.row_stride[0]);
}
+static void
+deinterlace_scanline_linear_blend2_planar_y_c (GstDeinterlaceSimpleMethod *
+ self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1,
+ scanlines->b1, self->parent.row_stride[0]);
+}
+
+static void
+deinterlace_scanline_linear_blend2_planar_u_c (GstDeinterlaceSimpleMethod *
+ self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1,
+ scanlines->b1, self->parent.row_stride[1]);
+}
+
+static void
+deinterlace_scanline_linear_blend2_planar_v_c (GstDeinterlaceSimpleMethod *
+ self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_blend2_c (self, out, scanlines->m0, scanlines->t1,
+ scanlines->b1, self->parent.row_stride[2]);
+}
+
#ifdef BUILD_X86_ASM
#include "mmx.h"
static inline void
@@ -145,6 +193,30 @@ deinterlace_scanline_linear_blend_packed_mmx (GstDeinterlaceSimpleMethod * self,
scanlines->b0, scanlines->m1, self->parent.row_stride[0]);
}
+static void
+deinterlace_scanline_linear_blend_planar_y_mmx (GstDeinterlaceSimpleMethod *
+ self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_blend_mmx (self, out, scanlines->t0,
+ scanlines->b0, scanlines->m1, self->parent.row_stride[0]);
+}
+
+static void
+deinterlace_scanline_linear_blend_planar_u_mmx (GstDeinterlaceSimpleMethod *
+ self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_blend_mmx (self, out, scanlines->t0,
+ scanlines->b0, scanlines->m1, self->parent.row_stride[1]);
+}
+
+static void
+deinterlace_scanline_linear_blend_planar_v_mmx (GstDeinterlaceSimpleMethod *
+ self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_blend_mmx (self, out, scanlines->t0,
+ scanlines->b0, scanlines->m1, self->parent.row_stride[2]);
+}
+
static inline void
deinterlace_scanline_linear_blend2_mmx (GstDeinterlaceSimpleMethod * self,
guint8 * out, const guint8 * m0, const guint8 * t1, const guint8 * b1,
@@ -206,6 +278,29 @@ deinterlace_scanline_linear_blend2_packed_mmx (GstDeinterlaceSimpleMethod *
scanlines->t1, scanlines->b1, self->parent.row_stride[0]);
}
+static void
+deinterlace_scanline_linear_blend2_planar_y_mmx (GstDeinterlaceSimpleMethod *
+ self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_blend2_mmx (self, out, scanlines->m0,
+ scanlines->t1, scanlines->b1, self->parent.row_stride[0]);
+}
+
+static void
+deinterlace_scanline_linear_blend2_planar_u_mmx (GstDeinterlaceSimpleMethod *
+ self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_blend2_mmx (self, out, scanlines->m0,
+ scanlines->t1, scanlines->b1, self->parent.row_stride[1]);
+}
+
+static void
+deinterlace_scanline_linear_blend2_planar_v_mmx (GstDeinterlaceSimpleMethod *
+ self, guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ deinterlace_scanline_linear_blend2_mmx (self, out, scanlines->m0,
+ scanlines->t1, scanlines->b1, self->parent.row_stride[2]);
+}
#endif
G_DEFINE_TYPE (GstDeinterlaceMethodLinearBlend,
@@ -231,8 +326,20 @@ static void
deinterlace_scanline_linear_blend_packed_c;
dism_class->interpolate_scanline_yvyu =
deinterlace_scanline_linear_blend_packed_c;
+ dism_class->interpolate_scanline_planar_y =
+ deinterlace_scanline_linear_blend_planar_y_c;
+ dism_class->interpolate_scanline_planar_u =
+ deinterlace_scanline_linear_blend_planar_u_c;
+ dism_class->interpolate_scanline_planar_v =
+ deinterlace_scanline_linear_blend_planar_v_c;
dism_class->copy_scanline_yuy2 = deinterlace_scanline_linear_blend2_packed_c;
dism_class->copy_scanline_yvyu = deinterlace_scanline_linear_blend2_packed_c;
+ dism_class->copy_scanline_planar_y =
+ deinterlace_scanline_linear_blend2_planar_y_c;
+ dism_class->copy_scanline_planar_u =
+ deinterlace_scanline_linear_blend2_planar_u_c;
+ dism_class->copy_scanline_planar_v =
+ deinterlace_scanline_linear_blend2_planar_v_c;
#ifdef BUILD_X86_ASM
if (cpu_flags & OIL_IMPL_FLAG_MMX) {
@@ -240,10 +347,23 @@ static void
deinterlace_scanline_linear_blend_packed_mmx;
dism_class->interpolate_scanline_yvyu =
deinterlace_scanline_linear_blend_packed_mmx;
+ dism_class->interpolate_scanline_planar_y =
+ deinterlace_scanline_linear_blend_planar_y_mmx;
+ dism_class->interpolate_scanline_planar_u =
+ deinterlace_scanline_linear_blend_planar_u_mmx;
+ dism_class->interpolate_scanline_planar_v =
+ deinterlace_scanline_linear_blend_planar_v_mmx;
+
dism_class->copy_scanline_yuy2 =
deinterlace_scanline_linear_blend2_packed_mmx;
dism_class->copy_scanline_yvyu =
deinterlace_scanline_linear_blend2_packed_mmx;
+ dism_class->copy_scanline_planar_y =
+ deinterlace_scanline_linear_blend2_planar_y_mmx;
+ dism_class->copy_scanline_planar_u =
+ deinterlace_scanline_linear_blend2_planar_u_mmx;
+ dism_class->copy_scanline_planar_v =
+ deinterlace_scanline_linear_blend2_planar_v_mmx;
}
#endif
}
diff --git a/gst/deinterlace/tvtime/scalerbob.c b/gst/deinterlace/tvtime/scalerbob.c
index d08b39679..94bfa92e3 100644
--- a/gst/deinterlace/tvtime/scalerbob.c
+++ b/gst/deinterlace/tvtime/scalerbob.c
@@ -45,6 +45,27 @@ deinterlace_scanline_scaler_bob_packed (GstDeinterlaceSimpleMethod * self,
oil_memcpy (out, scanlines->t0, self->parent.row_stride[0]);
}
+static void
+deinterlace_scanline_scaler_bob_planar_y (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->t0, self->parent.row_stride[0]);
+}
+
+static void
+deinterlace_scanline_scaler_bob_planar_u (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->t0, self->parent.row_stride[1]);
+}
+
+static void
+deinterlace_scanline_scaler_bob_planar_v (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->t0, self->parent.row_stride[2]);
+}
+
G_DEFINE_TYPE (GstDeinterlaceMethodScalerBob, gst_deinterlace_method_scaler_bob,
GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
@@ -65,6 +86,12 @@ gst_deinterlace_method_scaler_bob_class_init (GstDeinterlaceMethodScalerBobClass
deinterlace_scanline_scaler_bob_packed;
dism_class->interpolate_scanline_yvyu =
deinterlace_scanline_scaler_bob_packed;
+ dism_class->interpolate_scanline_planar_y =
+ deinterlace_scanline_scaler_bob_planar_y;
+ dism_class->interpolate_scanline_planar_u =
+ deinterlace_scanline_scaler_bob_planar_u;
+ dism_class->interpolate_scanline_planar_v =
+ deinterlace_scanline_scaler_bob_planar_v;
}
static void
diff --git a/gst/deinterlace/tvtime/weave.c b/gst/deinterlace/tvtime/weave.c
index ce040a4d8..46893dbaa 100644
--- a/gst/deinterlace/tvtime/weave.c
+++ b/gst/deinterlace/tvtime/weave.c
@@ -52,12 +52,54 @@ deinterlace_scanline_weave_packed (GstDeinterlaceSimpleMethod * self,
}
static void
+deinterlace_scanline_weave_planar_y (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->m1, self->parent.row_stride[0]);
+}
+
+static void
+deinterlace_scanline_weave_planar_u (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->m1, self->parent.row_stride[1]);
+}
+
+static void
+deinterlace_scanline_weave_planar_v (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->m1, self->parent.row_stride[2]);
+}
+
+static void
copy_scanline_packed (GstDeinterlaceSimpleMethod * self, guint8 * out,
const GstDeinterlaceScanlineData * scanlines)
{
oil_memcpy (out, scanlines->m0, self->parent.row_stride[0]);
}
+static void
+copy_scanline_planar_y (GstDeinterlaceSimpleMethod * self, guint8 * out,
+ const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->m0, self->parent.row_stride[0]);
+}
+
+static void
+copy_scanline_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out,
+ const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->m0, self->parent.row_stride[1]);
+}
+
+static void
+copy_scanline_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out,
+ const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->m0, self->parent.row_stride[2]);
+}
+
G_DEFINE_TYPE (GstDeinterlaceMethodWeave, gst_deinterlace_method_weave,
GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
@@ -75,7 +117,17 @@ gst_deinterlace_method_weave_class_init (GstDeinterlaceMethodWeaveClass * klass)
dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_yvyu = deinterlace_scanline_weave_packed;
+ dism_class->interpolate_scanline_planar_y =
+ deinterlace_scanline_weave_planar_y;
+ dism_class->interpolate_scanline_planar_u =
+ deinterlace_scanline_weave_planar_u;
+ dism_class->interpolate_scanline_planar_v =
+ deinterlace_scanline_weave_planar_v;
+ dism_class->copy_scanline_yuy2 = copy_scanline_packed;
dism_class->copy_scanline_yvyu = copy_scanline_packed;
+ dism_class->copy_scanline_planar_y = copy_scanline_planar_y;
+ dism_class->copy_scanline_planar_u = copy_scanline_planar_u;
+ dism_class->copy_scanline_planar_v = copy_scanline_planar_v;
}
static void
diff --git a/gst/deinterlace/tvtime/weavebff.c b/gst/deinterlace/tvtime/weavebff.c
index a4ed57e40..cba13d315 100644
--- a/gst/deinterlace/tvtime/weavebff.c
+++ b/gst/deinterlace/tvtime/weavebff.c
@@ -52,6 +52,27 @@ deinterlace_scanline_weave_packed (GstDeinterlaceSimpleMethod * self,
}
static void
+deinterlace_scanline_weave_planar_y (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->m1, self->parent.row_stride[0]);
+}
+
+static void
+deinterlace_scanline_weave_planar_u (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->m1, self->parent.row_stride[1]);
+}
+
+static void
+deinterlace_scanline_weave_planar_v (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->m1, self->parent.row_stride[2]);
+}
+
+static void
copy_scanline_packed (GstDeinterlaceSimpleMethod * self, guint8 * out,
const GstDeinterlaceScanlineData * scanlines)
{
@@ -63,6 +84,42 @@ copy_scanline_packed (GstDeinterlaceSimpleMethod * self, guint8 * out,
}
}
+static void
+copy_scanline_planar_y (GstDeinterlaceSimpleMethod * self, guint8 * out,
+ const GstDeinterlaceScanlineData * scanlines)
+{
+ /* FIXME: original code used m2 and m0 but this looks really bad */
+ if (scanlines->bottom_field) {
+ oil_memcpy (out, scanlines->bb2, self->parent.row_stride[0]);
+ } else {
+ oil_memcpy (out, scanlines->bb0, self->parent.row_stride[0]);
+ }
+}
+
+static void
+copy_scanline_planar_u (GstDeinterlaceSimpleMethod * self, guint8 * out,
+ const GstDeinterlaceScanlineData * scanlines)
+{
+ /* FIXME: original code used m2 and m0 but this looks really bad */
+ if (scanlines->bottom_field) {
+ oil_memcpy (out, scanlines->bb2, self->parent.row_stride[1]);
+ } else {
+ oil_memcpy (out, scanlines->bb0, self->parent.row_stride[1]);
+ }
+}
+
+static void
+copy_scanline_planar_v (GstDeinterlaceSimpleMethod * self, guint8 * out,
+ const GstDeinterlaceScanlineData * scanlines)
+{
+ /* FIXME: original code used m2 and m0 but this looks really bad */
+ if (scanlines->bottom_field) {
+ oil_memcpy (out, scanlines->bb2, self->parent.row_stride[2]);
+ } else {
+ oil_memcpy (out, scanlines->bb0, self->parent.row_stride[2]);
+ }
+}
+
G_DEFINE_TYPE (GstDeinterlaceMethodWeaveBFF, gst_deinterlace_method_weave_bff,
GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
@@ -81,8 +138,17 @@ gst_deinterlace_method_weave_bff_class_init (GstDeinterlaceMethodWeaveBFFClass *
dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_yvyu = deinterlace_scanline_weave_packed;
+ dism_class->interpolate_scanline_planar_y =
+ deinterlace_scanline_weave_planar_y;
+ dism_class->interpolate_scanline_planar_u =
+ deinterlace_scanline_weave_planar_u;
+ dism_class->interpolate_scanline_planar_v =
+ deinterlace_scanline_weave_planar_v;
dism_class->copy_scanline_yuy2 = copy_scanline_packed;
dism_class->copy_scanline_yvyu = copy_scanline_packed;
+ dism_class->copy_scanline_planar_y = copy_scanline_planar_y;
+ dism_class->copy_scanline_planar_u = copy_scanline_planar_u;
+ dism_class->copy_scanline_planar_v = copy_scanline_planar_v;
}
static void
diff --git a/gst/deinterlace/tvtime/weavetff.c b/gst/deinterlace/tvtime/weavetff.c
index 3f6083905..522d195ba 100644
--- a/gst/deinterlace/tvtime/weavetff.c
+++ b/gst/deinterlace/tvtime/weavetff.c
@@ -53,6 +53,27 @@ deinterlace_scanline_weave_packed (GstDeinterlaceSimpleMethod * self,
}
static void
+deinterlace_scanline_weave_planar_y (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->m1, self->parent.row_stride[0]);
+}
+
+static void
+deinterlace_scanline_weave_planar_u (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->m1, self->parent.row_stride[1]);
+}
+
+static void
+deinterlace_scanline_weave_planar_v (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ oil_memcpy (out, scanlines->m1, self->parent.row_stride[2]);
+}
+
+static void
copy_scanline_packed (GstDeinterlaceSimpleMethod * self,
guint8 * out, const GstDeinterlaceScanlineData * scanlines)
{
@@ -64,6 +85,42 @@ copy_scanline_packed (GstDeinterlaceSimpleMethod * self,
}
}
+static void
+copy_scanline_planar_y (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ /* FIXME: original code used m2 and m0 but this looks really bad */
+ if (scanlines->bottom_field) {
+ oil_memcpy (out, scanlines->bb0, self->parent.row_stride[0]);
+ } else {
+ oil_memcpy (out, scanlines->bb2, self->parent.row_stride[0]);
+ }
+}
+
+static void
+copy_scanline_planar_u (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ /* FIXME: original code used m2 and m0 but this looks really bad */
+ if (scanlines->bottom_field) {
+ oil_memcpy (out, scanlines->bb0, self->parent.row_stride[1]);
+ } else {
+ oil_memcpy (out, scanlines->bb2, self->parent.row_stride[1]);
+ }
+}
+
+static void
+copy_scanline_planar_v (GstDeinterlaceSimpleMethod * self,
+ guint8 * out, const GstDeinterlaceScanlineData * scanlines)
+{
+ /* FIXME: original code used m2 and m0 but this looks really bad */
+ if (scanlines->bottom_field) {
+ oil_memcpy (out, scanlines->bb0, self->parent.row_stride[2]);
+ } else {
+ oil_memcpy (out, scanlines->bb2, self->parent.row_stride[2]);
+ }
+}
+
G_DEFINE_TYPE (GstDeinterlaceMethodWeaveTFF, gst_deinterlace_method_weave_tff,
GST_TYPE_DEINTERLACE_SIMPLE_METHOD);
@@ -82,8 +139,17 @@ gst_deinterlace_method_weave_tff_class_init (GstDeinterlaceMethodWeaveTFFClass *
dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_yvyu = deinterlace_scanline_weave_packed;
+ dism_class->interpolate_scanline_planar_y =
+ deinterlace_scanline_weave_planar_y;
+ dism_class->interpolate_scanline_planar_u =
+ deinterlace_scanline_weave_planar_u;
+ dism_class->interpolate_scanline_planar_v =
+ deinterlace_scanline_weave_planar_v;
dism_class->copy_scanline_yuy2 = copy_scanline_packed;
dism_class->copy_scanline_yvyu = copy_scanline_packed;
+ dism_class->copy_scanline_planar_y = copy_scanline_planar_y;
+ dism_class->copy_scanline_planar_u = copy_scanline_planar_u;
+ dism_class->copy_scanline_planar_v = copy_scanline_planar_v;
}
static void