From: Sebastian Dröge Date: Wed, 15 Apr 2009 13:33:17 +0000 (+0200) Subject: [MOVED FROM BAD 47/56] deinterlace2: Add initial support for automatic detection... X-Git-Tag: RELEASE-0.10.15~75 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d28f09abf7731d329102e508bb717f2b64074f5d;p=platform%2Fupstream%2Fgst-plugins-good.git [MOVED FROM BAD 47/56] deinterlace2: Add initial support for automatic detection of the field order --- diff --git a/gst/deinterlace2/gstdeinterlace2.c b/gst/deinterlace2/gstdeinterlace2.c index f703bd76b..b475d5b61 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 408061886..35cb55bf3 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;