Fixes bug #642961.
}
#define DEINTERLACE_CAPS \
- GST_VIDEO_CAPS_YUV ("{ AYUV, Y444, YUY2, YVYU, UYVY, Y42B, I420, YV12, Y41B }") ";" \
+ GST_VIDEO_CAPS_YUV ("{ AYUV, Y444, YUY2, YVYU, UYVY, Y42B, I420, YV12, Y41B, NV12 }") ";" \
GST_VIDEO_CAPS_ARGB ";" GST_VIDEO_CAPS_ABGR ";" \
GST_VIDEO_CAPS_RGBA ";" GST_VIDEO_CAPS_BGRA ";" \
GST_VIDEO_CAPS_xRGB ";" GST_VIDEO_CAPS_xBGR ";" \
return (klass->deinterlace_frame_y41b != NULL);
case GST_VIDEO_FORMAT_AYUV:
return (klass->deinterlace_frame_ayuv != NULL);
+ case GST_VIDEO_FORMAT_NV12:
+ return (klass->deinterlace_frame_nv12 != NULL);
case GST_VIDEO_FORMAT_ARGB:
case GST_VIDEO_FORMAT_xRGB:
return (klass->deinterlace_frame_argb != NULL);
case GST_VIDEO_FORMAT_AYUV:
self->deinterlace_frame = klass->deinterlace_frame_ayuv;
break;
+ case GST_VIDEO_FORMAT_NV12:
+ self->deinterlace_frame = klass->deinterlace_frame_nv12;
+ break;
case GST_VIDEO_FORMAT_ARGB:
case GST_VIDEO_FORMAT_xRGB:
self->deinterlace_frame = klass->deinterlace_frame_argb;
case GST_VIDEO_FORMAT_AYUV:
return (klass->interpolate_scanline_ayuv != NULL
&& klass->copy_scanline_ayuv != NULL);
+ case GST_VIDEO_FORMAT_NV12:
+ return (klass->interpolate_scanline_nv12 != NULL
+ && klass->copy_scanline_nv12 != NULL);
case GST_VIDEO_FORMAT_I420:
case GST_VIDEO_FORMAT_YV12:
case GST_VIDEO_FORMAT_Y444:
}
static void
+gst_deinterlace_simple_method_deinterlace_frame_nv12 (GstDeinterlaceMethod *
+ method, const GstDeinterlaceField * history, guint history_count,
+ GstBuffer * outbuf)
+{
+ GstDeinterlaceSimpleMethod *self = GST_DEINTERLACE_SIMPLE_METHOD (method);
+ GstDeinterlaceMethodClass *dm_class = GST_DEINTERLACE_METHOD_GET_CLASS (self);
+ guint8 *out;
+ const guint8 *field0, *field1, *field2, *field3;
+ gint cur_field_idx = history_count - dm_class->fields_required;
+ guint cur_field_flags = history[cur_field_idx].flags;
+ gint i, offset;
+
+ g_assert (self->interpolate_scanline_packed != NULL);
+ g_assert (self->copy_scanline_packed != NULL);
+
+ for (i = 0; i < 2; i++) {
+ offset = self->parent.offset[i];
+
+ out = GST_BUFFER_DATA (outbuf) + offset;
+
+ field0 = GST_BUFFER_DATA (history[cur_field_idx].buf) + offset;
+
+ g_assert (dm_class->fields_required <= 4);
+
+ field1 = NULL;
+ if (dm_class->fields_required >= 2) {
+ field1 = GST_BUFFER_DATA (history[cur_field_idx + 1].buf) + offset;
+ }
+
+ field2 = NULL;
+ if (dm_class->fields_required >= 3) {
+ field2 = GST_BUFFER_DATA (history[cur_field_idx + 2].buf) + offset;
+ }
+
+ field3 = NULL;
+ if (dm_class->fields_required >= 4) {
+ field3 = GST_BUFFER_DATA (history[cur_field_idx + 3].buf) + offset;
+ }
+
+ gst_deinterlace_simple_method_deinterlace_frame_planar_plane (self, out,
+ field0, field1, field2, field3, cur_field_flags, i,
+ self->copy_scanline_packed, self->interpolate_scanline_packed);
+ }
+}
+
+static void
gst_deinterlace_simple_method_setup (GstDeinterlaceMethod * method,
GstVideoFormat format, gint width, gint height)
{
self->interpolate_scanline_packed = klass->interpolate_scanline_bgr;
self->copy_scanline_packed = klass->copy_scanline_bgr;
break;
+ case GST_VIDEO_FORMAT_NV12:
+ self->interpolate_scanline_packed = klass->interpolate_scanline_nv12;
+ self->copy_scanline_packed = klass->copy_scanline_nv12;
+ break;
case GST_VIDEO_FORMAT_I420:
case GST_VIDEO_FORMAT_YV12:
case GST_VIDEO_FORMAT_Y444:
gst_deinterlace_simple_method_deinterlace_frame_planar;
dm_class->deinterlace_frame_y41b =
gst_deinterlace_simple_method_deinterlace_frame_planar;
+ dm_class->deinterlace_frame_nv12 =
+ gst_deinterlace_simple_method_deinterlace_frame_nv12;
dm_class->fields_required = 2;
dm_class->setup = gst_deinterlace_simple_method_setup;
dm_class->supported = gst_deinterlace_simple_method_supported;
gst_deinterlace_simple_method_interpolate_scanline_packed;
klass->copy_scanline_uyvy =
gst_deinterlace_simple_method_copy_scanline_packed;
+ klass->interpolate_scanline_nv12 =
+ gst_deinterlace_simple_method_interpolate_scanline_packed;
+ klass->copy_scanline_nv12 =
+ gst_deinterlace_simple_method_copy_scanline_packed;
klass->interpolate_scanline_argb =
gst_deinterlace_simple_method_interpolate_scanline_packed;
gst_deinterlace_simple_method_interpolate_scanline_packed;
klass->copy_scanline_bgra =
gst_deinterlace_simple_method_copy_scanline_packed;
-
klass->interpolate_scanline_rgb =
gst_deinterlace_simple_method_interpolate_scanline_packed;
klass->copy_scanline_rgb = gst_deinterlace_simple_method_copy_scanline_packed;
GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y42b;
GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_y41b;
GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_ayuv;
+ GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_nv12;
GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_argb;
GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_abgr;
GstDeinterlaceMethodDeinterlaceFunction deinterlace_frame_rgba;
GstDeinterlaceSimpleMethodFunction copy_scanline_rgb;
GstDeinterlaceSimpleMethodFunction interpolate_scanline_bgr;
GstDeinterlaceSimpleMethodFunction copy_scanline_bgr;
+ GstDeinterlaceSimpleMethodFunction interpolate_scanline_nv12;
+ GstDeinterlaceSimpleMethodFunction copy_scanline_nv12;
+
/* Planar formats */
GstDeinterlaceSimpleMethodFunction copy_scanline_planar_y;
dism_class->interpolate_scanline_bgra = deinterlace_scanline_linear_packed_c;
dism_class->interpolate_scanline_rgb = deinterlace_scanline_linear_packed_c;
dism_class->interpolate_scanline_bgr = deinterlace_scanline_linear_packed_c;
+ dism_class->interpolate_scanline_nv12 = 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_blend_packed_c;
dism_class->interpolate_scanline_bgr =
deinterlace_scanline_linear_blend_packed_c;
+ dism_class->interpolate_scanline_nv12 =
+ deinterlace_scanline_linear_blend_packed_c;
dism_class->interpolate_scanline_planar_y =
deinterlace_scanline_linear_blend_planar_y_c;
deinterlace_scanline_scaler_bob_packed;
dism_class->interpolate_scanline_uyvy =
deinterlace_scanline_scaler_bob_packed;
+ dism_class->interpolate_scanline_nv12 =
+ deinterlace_scanline_scaler_bob_packed;
dism_class->interpolate_scanline_argb =
deinterlace_scanline_scaler_bob_packed;
dism_class->interpolate_scanline_abgr =
dism_class->interpolate_scanline_yuy2 = deinterlace_line_packed_mmx;
dism_class->interpolate_scanline_yvyu = deinterlace_line_packed_mmx;
dism_class->interpolate_scanline_uyvy = deinterlace_line_packed_mmx;
+ dism_class->interpolate_scanline_nv12 = deinterlace_line_packed_mmx;
dism_class->interpolate_scanline_argb = deinterlace_line_packed_mmx;
dism_class->interpolate_scanline_abgr = deinterlace_line_packed_mmx;
dism_class->interpolate_scanline_rgba = deinterlace_line_packed_mmx;
dism_class->interpolate_scanline_yvyu = deinterlace_line_packed_c;
dism_class->interpolate_scanline_uyvy = deinterlace_line_packed_c;
dism_class->interpolate_scanline_ayuv = deinterlace_line_packed_c;
+ dism_class->interpolate_scanline_nv12 = deinterlace_line_packed_c;
dism_class->interpolate_scanline_argb = deinterlace_line_packed_c;
dism_class->interpolate_scanline_abgr = deinterlace_line_packed_c;
dism_class->interpolate_scanline_rgba = deinterlace_line_packed_c;
dism_class->interpolate_scanline_yuy2 = deinterlace_line_packed_c;
dism_class->interpolate_scanline_yvyu = deinterlace_line_packed_c;
dism_class->interpolate_scanline_uyvy = deinterlace_line_packed_c;
+ dism_class->interpolate_scanline_nv12 = deinterlace_line_packed_c;
dism_class->interpolate_scanline_argb = deinterlace_line_packed_c;
dism_class->interpolate_scanline_abgr = deinterlace_line_packed_c;
dism_class->interpolate_scanline_rgba = deinterlace_line_packed_c;
dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_yvyu = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_uyvy = deinterlace_scanline_weave_packed;
+ dism_class->interpolate_scanline_nv12 = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_argb = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_abgr = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_rgba = deinterlace_scanline_weave_packed;
dism_class->copy_scanline_yuy2 = copy_scanline_packed;
dism_class->copy_scanline_yvyu = copy_scanline_packed;
dism_class->copy_scanline_uyvy = copy_scanline_packed;
+ dism_class->copy_scanline_nv12 = copy_scanline_packed;
dism_class->copy_scanline_argb = copy_scanline_packed;
dism_class->copy_scanline_abgr = copy_scanline_packed;
dism_class->copy_scanline_rgba = copy_scanline_packed;
dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_yvyu = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_uyvy = deinterlace_scanline_weave_packed;
+ dism_class->interpolate_scanline_nv12 = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_argb = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_abgr = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_rgba = deinterlace_scanline_weave_packed;
dism_class->copy_scanline_yuy2 = copy_scanline_packed;
dism_class->copy_scanline_yvyu = copy_scanline_packed;
dism_class->copy_scanline_uyvy = copy_scanline_packed;
+ dism_class->copy_scanline_nv12 = copy_scanline_packed;
dism_class->copy_scanline_argb = copy_scanline_packed;
dism_class->copy_scanline_abgr = copy_scanline_packed;
dism_class->copy_scanline_rgba = copy_scanline_packed;
dism_class->interpolate_scanline_yuy2 = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_yvyu = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_uyvy = deinterlace_scanline_weave_packed;
+ dism_class->interpolate_scanline_nv12 = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_argb = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_abgr = deinterlace_scanline_weave_packed;
dism_class->interpolate_scanline_rgba = deinterlace_scanline_weave_packed;
dism_class->copy_scanline_yuy2 = copy_scanline_packed;
dism_class->copy_scanline_yvyu = copy_scanline_packed;
dism_class->copy_scanline_uyvy = copy_scanline_packed;
+ dism_class->copy_scanline_nv12 = copy_scanline_packed;
dism_class->copy_scanline_argb = copy_scanline_packed;
dism_class->copy_scanline_abgr = copy_scanline_packed;
dism_class->copy_scanline_rgba = copy_scanline_packed;