From a73644a7b941b8fa270824ef7bd9d40d60cafd10 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 18 Nov 2013 13:41:07 -0300 Subject: [PATCH] video-uri-source: Handle interlaced videos https://bugzilla.gnome.org/show_bug.cgi?id=710168 --- ges/ges-video-uri-source.c | 41 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/ges/ges-video-uri-source.c b/ges/ges-video-uri-source.c index 0acd7f96ac..9b4b943c40 100644 --- a/ges/ges-video-uri-source.c +++ b/ges/ges-video-uri-source.c @@ -23,6 +23,8 @@ * @short_description: outputs a single video stream from a given file */ +#include + #include "ges-utils.h" #include "ges-internal.h" #include "ges-track-element.h" @@ -41,12 +43,23 @@ enum PROP_URI }; +static void +post_missing_element_message (GstElement * element, const gchar * name) +{ + GstMessage *msg; + + msg = gst_missing_element_message_new (element, name); + gst_element_post_message (element, msg); +} + /* GESSource VMethod */ static GstElement * ges_video_uri_source_create_source (GESTrackElement * trksrc) { GESVideoUriSource *self; GESTrack *track; + GstDiscovererVideoInfo *info; + GESUriSourceAsset *asset; GstElement *decodebin; self = (GESVideoUriSource *) trksrc; @@ -58,6 +71,34 @@ ges_video_uri_source_create_source (GESTrackElement * trksrc) g_object_set (decodebin, "caps", ges_track_get_caps (track), "expose-all-streams", FALSE, "uri", self->uri, NULL); + if ((asset = + GES_URI_SOURCE_ASSET (ges_extractable_get_asset (GES_EXTRACTABLE + (trksrc)))) != NULL) { + info = + GST_DISCOVERER_VIDEO_INFO (ges_uri_source_asset_get_stream_info + (asset)); + + g_assert (info); + if (gst_discoverer_video_info_is_interlaced (info)) { + GstElement *deinterlace; + + deinterlace = gst_element_factory_make ("deinterlace", "deinterlace"); + if (deinterlace == NULL) { + deinterlace = gst_element_factory_make ("avdeinterlace", "deinterlace"); + } + if (deinterlace == NULL) { + post_missing_element_message (decodebin, "deinterlace"); + GST_ELEMENT_WARNING (decodebin, CORE, MISSING_PLUGIN, + ("Missing element '%s' - check your GStreamer installation.", + "deinterlace"), ("deinterlacing won't work")); + } + + return ges_source_create_topbin ("deinterlace-bin", decodebin, + gst_element_factory_make ("videoconvert", NULL), deinterlace, NULL); + } + } + + return decodebin; }