* @short_description: Base Class for video sources
*/
+#include <gst/pbutils/missing-plugins.h>
+
#include "ges-internal.h"
#include "ges/ges-meta-container.h"
#include "ges-track-element.h"
10000 - ges_layer_get_priority (self->priv->layer), NULL);
}
+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);
+}
+
static GstElement *
ges_video_source_create_element (GESTrackElement * trksrc)
{
GstElement *sub_element;
GESVideoSourceClass *source_class = GES_VIDEO_SOURCE_GET_CLASS (trksrc);
GESVideoSource *self;
- GstElement *positionner, *videoscale, *videorate, *capsfilter;
+ GstElement *positionner, *videoscale, *videorate, *capsfilter, *videoconvert,
+ *deinterlace;
const gchar *props[] = { "alpha", "posx", "posy", "width", "height", NULL };
GESTimelineElement *parent;
videoscale =
gst_element_factory_make ("videoscale", "track-element-videoscale");
+ videoconvert =
+ gst_element_factory_make ("videoconvert", "track-element-videoconvert");
videorate = gst_element_factory_make ("videorate", "track-element-videorate");
+ deinterlace = gst_element_factory_make ("deinterlace", "deinterlace");
+ if (deinterlace == NULL) {
+ deinterlace = gst_element_factory_make ("avdeinterlace", "deinterlace");
+ }
capsfilter =
gst_element_factory_make ("capsfilter", "track-element-capsfilter");
(positionner), trksrc, capsfilter);
ges_track_element_add_children_props (trksrc, positionner, NULL, NULL, props);
- topbin =
- ges_source_create_topbin ("videosrcbin", sub_element, positionner,
- videoscale, videorate, capsfilter, NULL);
+
+ if (deinterlace == NULL) {
+ post_missing_element_message (sub_element, "deinterlace");
+
+ GST_ELEMENT_WARNING (sub_element, CORE, MISSING_PLUGIN,
+ ("Missing element '%s' - check your GStreamer installation.",
+ "deinterlace"), ("deinterlacing won't work"));
+ topbin =
+ ges_source_create_topbin ("videosrcbin", sub_element, videoconvert,
+ positionner, videoscale, videorate, capsfilter, NULL);
+ } else {
+ topbin =
+ ges_source_create_topbin ("videosrcbin", sub_element, videoconvert,
+ deinterlace, positionner, videoscale, videorate, capsfilter, NULL);
+ }
+
parent = ges_timeline_element_get_parent (GES_TIMELINE_ELEMENT (trksrc));
if (parent) {
self->priv->positionner = GST_FRAME_POSITIONNER (positionner);
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;
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;
}