From: Jan Schmidt Date: Thu, 2 Jan 2020 15:33:25 +0000 (+1100) Subject: deinterlace: Allow for 5 fields for interpolation X-Git-Tag: 1.19.3~509^2~603 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1c1bc56a3b1aa75aa3119a5f8d3f8a88dfbf6bf0;p=platform%2Fupstream%2Fgstreamer.git deinterlace: Allow for 5 fields for interpolation Add an extra field to the simple deinterlace implementation, so that methods can potentially use 5 fields - the current field, and 2 before and 2 after. Part-of: --- diff --git a/gst/deinterlace/gstdeinterlacemethod.c b/gst/deinterlace/gstdeinterlacemethod.c index 286dc7c..ba5bd52 100644 --- a/gst/deinterlace/gstdeinterlacemethod.c +++ b/gst/deinterlace/gstdeinterlacemethod.c @@ -377,7 +377,7 @@ gst_deinterlace_simple_method_deinterlace_frame_packed (GstDeinterlaceMethod * if (framep) frame_width = MIN (frame_width, GST_VIDEO_FRAME_PLANE_STRIDE (framep, 0)); - g_assert (dm_class->fields_required <= 4); + g_assert (dm_class->fields_required <= 5); frame1 = (cur_field_idx + 1 < @@ -418,6 +418,9 @@ gst_deinterlace_simple_method_deinterlace_frame_packed (GstDeinterlaceMethod * frame_width); } else { /* interpolating */ + scanlines.tp2 = get_line (&lg, -2, 0, i, -1); + scanlines.bp2 = get_line (&lg, -2, 0, i, 1); + scanlines.ttp = get_line (&lg, -1, 0, i, -2); scanlines.mp = get_line (&lg, -1, 0, i, 0); scanlines.bbp = get_line (&lg, -1, 0, i, 2); @@ -532,6 +535,9 @@ static void copy_scanline (self, LINE (dest, i), &scanlines, frame_width); } else { /* interpolating */ + scanlines.tp2 = get_line (lg, -2, plane, i, -1); + scanlines.bp2 = get_line (lg, -2, plane, i, 1); + scanlines.ttp = get_line (lg, -1, plane, i, -2); scanlines.mp = get_line (lg, -1, plane, i, 0); scanlines.bbp = get_line (lg, -1, plane, i, 2); @@ -573,7 +579,7 @@ gst_deinterlace_simple_method_deinterlace_frame_planar (GstDeinterlaceMethod * g_assert (self->copy_scanline_planar[0] != NULL); g_assert (self->copy_scanline_planar[1] != NULL); g_assert (self->copy_scanline_planar[2] != NULL); - g_assert (dm_class->fields_required <= 4); + g_assert (dm_class->fields_required <= 5); for (i = 0; i < 3; i++) { copy_scanline = self->copy_scanline_planar[i]; @@ -599,7 +605,7 @@ gst_deinterlace_simple_method_deinterlace_frame_nv12 (GstDeinterlaceMethod * g_assert (self->interpolate_scanline_packed != NULL); g_assert (self->copy_scanline_packed != NULL); - g_assert (dm_class->fields_required <= 4); + g_assert (dm_class->fields_required <= 5); for (i = 0; i < 2; i++) { gst_deinterlace_simple_method_deinterlace_frame_planar_plane (self, diff --git a/gst/deinterlace/gstdeinterlacemethod.h b/gst/deinterlace/gstdeinterlacemethod.h index e967f2c..6c421c1 100644 --- a/gst/deinterlace/gstdeinterlacemethod.h +++ b/gst/deinterlace/gstdeinterlacemethod.h @@ -135,19 +135,20 @@ struct _GstDeinterlaceScanlineData { const guint8 *tt0, *t0, *m0, *b0, *bb0; const guint8 *tt1, *t1, *m1, *b1, *bb1; const guint8 *tt2, *t2, *m2, *b2, *bb2; + const guint8 *tp2, *bp2; gboolean bottom_field; }; /* * For interpolate_scanline the input is: * - * | t-3 t-2 t-1 t t+1 - * | Field 3 | Field 2 | Field 1 | Field 0 | Field -1 - * | TT3 | | TT1 | | TTp - * | | T2 | | T0 | - * | M3 | | M1 | | Mp - * | | B2 | | B0 | - * | BB3 | | BB1 | | BBp + * | t-3 t-2 t-1 t t+1 t+2 + * | Field 3 | Field 2 | Field 1 | Field 0 | Field -1 | Field -2 + * | TT3 | | TT1 | | TTp | + * | | T2 | | T0 | | Tp2 + * | M3 | | M1 | | Mp | + * | | B2 | | B0 | | Bp2 + * | BB3 | | BB1 | | BBp | * * For copy_scanline the input is: *