diff options
author | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2009-04-15 15:33:17 +0200 |
---|---|---|
committer | Sebastian Dröge <sebastian.droege@collabora.co.uk> | 2009-04-15 15:33:17 +0200 |
commit | b66a6f90beb4edb7cd96399880fae9892f827c11 (patch) | |
tree | 369f32939fc86f5dfba5833063fc540fd608a122 /gst/deinterlace2 | |
parent | 5a95bac3906a87361b3fb359c5a475a736e4e5fe (diff) | |
download | gst-plugins-bad-b66a6f90beb4edb7cd96399880fae9892f827c11.tar.gz gst-plugins-bad-b66a6f90beb4edb7cd96399880fae9892f827c11.tar.bz2 gst-plugins-bad-b66a6f90beb4edb7cd96399880fae9892f827c11.zip |
deinterlace2: Add initial support for automatic detection of the field order
Diffstat (limited to 'gst/deinterlace2')
-rw-r--r-- | gst/deinterlace2/gstdeinterlace2.c | 15 | ||||
-rw-r--r-- | gst/deinterlace2/gstdeinterlace2.h | 1 |
2 files changed, 11 insertions, 5 deletions
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; |