From b66a6f90beb4edb7cd96399880fae9892f827c11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 15 Apr 2009 15:33:17 +0200 Subject: deinterlace2: Add initial support for automatic detection of the field order --- gst/deinterlace2/gstdeinterlace2.c | 15 ++++++++++----- gst/deinterlace2/gstdeinterlace2.h | 1 + 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'gst/deinterlace2') diff --git a/gst/deinterlace2/gstdeinterlace2.c b/gst/deinterlace2/gstdeinterlace2.c index f703bd76..b475d5b6 100644 --- a/gst/deinterlace2/gstdeinterlace2.c +++ b/gst/deinterlace2/gstdeinterlace2.c @@ -692,6 +692,7 @@ gst_deinterlace2_push_history (GstDeinterlace2 * self, GstBuffer * buffer) { int i = 1; GstClockTime timestamp; + GstDeinterlace2FieldLayout field_layout = self->field_layout; g_assert (self->history_count < MAX_FIELD_HISTORY - 2); @@ -700,13 +701,16 @@ gst_deinterlace2_push_history (GstDeinterlace2 * self, GstBuffer * buffer) self->field_history[i].flags = self->field_history[i - 2].flags; } - if (self->field_layout == GST_DEINTERLACE2_LAYOUT_AUTO) { - GST_WARNING ("Could not detect field layout. Assuming top field first."); - self->field_layout = GST_DEINTERLACE2_LAYOUT_TFF; + if (field_layout == GST_DEINTERLACE2_LAYOUT_AUTO) { + if (!self->interlaced + || GST_BUFFER_FLAG_IS_SET (buffer, GST_VIDEO_BUFFER_TFF)) + field_layout = GST_DEINTERLACE2_LAYOUT_TFF; + else + field_layout = GST_DEINTERLACE2_LAYOUT_BFF; } - if (self->field_layout == GST_DEINTERLACE2_LAYOUT_TFF) { + if (field_layout == GST_DEINTERLACE2_LAYOUT_TFF) { GST_DEBUG ("Top field first"); self->field_history[0].buf = gst_buffer_create_sub (buffer, self->line_length, @@ -1077,10 +1081,11 @@ gst_deinterlace2_setcaps (GstPad * pad, GstCaps * caps) gst_structure_get_fraction (structure, "framerate", &self->frame_rate_n, &self->frame_rate_d); res &= gst_structure_get_fourcc (structure, "format", &fourcc); - /* TODO: get interlaced, field_layout, field_order */ + res &= gst_video_format_parse_caps_interlaced (caps, &self->interlaced); if (!res) goto invalid_caps; + /* FIXME: Only do this when self->interlaced == TRUE ? */ if (self->fields == GST_DEINTERLACE2_ALL) { gint fps_n = self->frame_rate_n, fps_d = self->frame_rate_d; diff --git a/gst/deinterlace2/gstdeinterlace2.h b/gst/deinterlace2/gstdeinterlace2.h index 40806188..35cb55bf 100644 --- a/gst/deinterlace2/gstdeinterlace2.h +++ b/gst/deinterlace2/gstdeinterlace2.h @@ -199,6 +199,7 @@ struct _GstDeinterlace2 guint frame_size; gint frame_rate_n, frame_rate_d; + gboolean interlaced; /* Duration of one field */ GstClockTime field_duration; -- cgit v1.2.1