summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2009-04-15 15:33:17 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2009-04-15 15:33:17 +0200
commitb66a6f90beb4edb7cd96399880fae9892f827c11 (patch)
tree369f32939fc86f5dfba5833063fc540fd608a122
parent5a95bac3906a87361b3fb359c5a475a736e4e5fe (diff)
downloadgst-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
-rw-r--r--gst/deinterlace2/gstdeinterlace2.c15
-rw-r--r--gst/deinterlace2/gstdeinterlace2.h1
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;