diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2010-04-24 16:28:12 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2010-04-29 19:28:24 +0200 |
commit | eeb5a23483167ca6ec5b81ef553d71c4134a4283 (patch) | |
tree | 2a2633292d93f25ccdf0a6d31472f2871fb6c272 | |
parent | 4ca4ac3f03e6d902b80e572da8098b08ba157c1f (diff) |
deinterlace: Add planar YUV support to all other simple methods
-rw-r--r-- | gst/deinterlace/tvtime/linear.c | 90 | ||||
-rw-r--r-- | gst/deinterlace/tvtime/linearblend.c | 120 | ||||
-rw-r--r-- | gst/deinterlace/tvtime/scalerbob.c | 27 | ||||
-rw-r--r-- | gst/deinterlace/tvtime/weave.c | 52 | ||||
-rw-r--r-- | gst/deinterlace/tvtime/weavebff.c | 66 | ||||
-rw-r--r-- | gst/deinterlace/tvtime/weavetff.c | 66 |
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 |