static void gst_deinterlace_simple_method_deinterlace_frame_planar (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 = NULL, *field1 = NULL, *field2 = NULL, *field3 = NULL; gint cur_field_idx = history_count - dm_class->fields_required; guint cur_field_flags = history[cur_field_idx].flags; gint i, row_stride, offset; GstDeinterlaceSimpleMethodFunction copy_scanline; GstDeinterlaceSimpleMethodFunction interpolate_scanline; g_assert (self->interpolate_scanline_planar[0] != NULL); g_assert (self->interpolate_scanline_planar[1] != NULL); g_assert (self->interpolate_scanline_planar[2] != NULL); g_assert (self->copy_scanline_planar[0] != NULL); g_assert (self->copy_scanline_planar[1] != NULL); g_assert (self->copy_scanline_planar[2] != NULL); for (i = 0; i < 3; i++) { row_stride = self->parent.row_stride[i]; offset = self->parent.offset[i]; copy_scanline = self->copy_scanline_planar[i]; interpolate_scanline = self->interpolate_scanline_planar[i]; out = GST_BUFFER_DATA (outbuf) + offset; field0 = GST_BUFFER_DATA (history[cur_field_idx].buf) + offset; if (history[cur_field_idx].flags & PICTURE_INTERLACED_BOTTOM) field0 += row_stride; g_assert (dm_class->fields_required <= 4); if (dm_class->fields_required >= 2) { field1 = GST_BUFFER_DATA (history[cur_field_idx + 1].buf) + offset; if (history[cur_field_idx + 1].flags & PICTURE_INTERLACED_BOTTOM) field1 += row_stride; } if (dm_class->fields_required >= 3) { field2 = GST_BUFFER_DATA (history[cur_field_idx + 2].buf) + offset; if (history[cur_field_idx + 2].flags & PICTURE_INTERLACED_BOTTOM) field2 += row_stride; } if (dm_class->fields_required >= 4) { field3 = GST_BUFFER_DATA (history[cur_field_idx + 3].buf) + offset; if (history[cur_field_idx + 3].flags & PICTURE_INTERLACED_BOTTOM) field3 += row_stride; } gst_deinterlace_simple_method_deinterlace_frame_planar_plane (self, out, field0, field1, field2, field3, cur_field_flags, i, copy_scanline, interpolate_scanline); } }
static void gst_deinterlace_simple_method_deinterlace_frame_planar (GstDeinterlaceMethod * method, const GstDeinterlaceField * history, guint history_count, GstBuffer * outbuf, gint cur_field_idx) { GstDeinterlaceSimpleMethod *self = GST_DEINTERLACE_SIMPLE_METHOD (method); GstDeinterlaceMethodClass *dm_class = GST_DEINTERLACE_METHOD_GET_CLASS (self); guint8 *out; const guint8 *field0, *field1, *field2, *fieldp; guint cur_field_flags = history[cur_field_idx].flags; gint i, offset; GstDeinterlaceSimpleMethodFunction copy_scanline; GstDeinterlaceSimpleMethodFunction interpolate_scanline; g_assert (self->interpolate_scanline_planar[0] != NULL); g_assert (self->interpolate_scanline_planar[1] != NULL); g_assert (self->interpolate_scanline_planar[2] != NULL); g_assert (self->copy_scanline_planar[0] != NULL); g_assert (self->copy_scanline_planar[1] != NULL); g_assert (self->copy_scanline_planar[2] != NULL); for (i = 0; i < 3; i++) { offset = self->parent.offset[i]; copy_scanline = self->copy_scanline_planar[i]; interpolate_scanline = self->interpolate_scanline_planar[i]; out = GST_BUFFER_DATA (outbuf) + offset; fieldp = NULL; if (cur_field_idx > 0) { fieldp = GST_BUFFER_DATA (history[cur_field_idx - 1].buf) + offset; } field0 = GST_BUFFER_DATA (history[cur_field_idx].buf) + offset; g_assert (dm_class->fields_required <= 4); field1 = NULL; if (cur_field_idx + 1 < history_count) { field1 = GST_BUFFER_DATA (history[cur_field_idx + 1].buf) + offset; } field2 = NULL; if (cur_field_idx + 2 < history_count) { field2 = GST_BUFFER_DATA (history[cur_field_idx + 2].buf) + offset; } gst_deinterlace_simple_method_deinterlace_frame_planar_plane (self, out, field0, field1, field2, fieldp, cur_field_flags, i, copy_scanline, interpolate_scanline); } }
static void gst_deinterlace_simple_method_deinterlace_frame_nv12 (GstDeinterlaceMethod * method, const GstDeinterlaceField * history, guint history_count, GstVideoFrame * outframe, gint cur_field_idx) { GstDeinterlaceSimpleMethod *self = GST_DEINTERLACE_SIMPLE_METHOD (method); GstDeinterlaceMethodClass *dm_class = GST_DEINTERLACE_METHOD_GET_CLASS (self); guint8 *out; const guint8 *field0, *field1, *field2, *fieldp; guint cur_field_flags = history[cur_field_idx].flags; gint i; g_assert (self->interpolate_scanline_packed != NULL); g_assert (self->copy_scanline_packed != NULL); for (i = 0; i < 2; i++) { out = GST_VIDEO_FRAME_PLANE_DATA (outframe, i); fieldp = NULL; if (cur_field_idx > 0) { fieldp = GST_VIDEO_FRAME_PLANE_DATA (history[cur_field_idx - 1].frame, i); } field0 = GST_VIDEO_FRAME_PLANE_DATA (history[cur_field_idx].frame, i); g_assert (dm_class->fields_required <= 4); field1 = NULL; if (cur_field_idx + 1 < history_count) { field1 = GST_VIDEO_FRAME_PLANE_DATA (history[cur_field_idx + 1].frame, i); } field2 = NULL; if (cur_field_idx + 2 < history_count) { field2 = GST_VIDEO_FRAME_PLANE_DATA (history[cur_field_idx + 2].frame, i); } gst_deinterlace_simple_method_deinterlace_frame_planar_plane (self, out, field0, field1, field2, fieldp, cur_field_flags, i, self->copy_scanline_packed, self->interpolate_scanline_packed); } }