summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2014-09-16 21:42:46 +0300
committerSebastian Dröge <sebastian@centricular.com>2014-09-16 21:46:55 +0300
commit9d3eeab150e2b26cae8821d726502b38713a81d5 (patch)
treee291be159a07750bcf4a0d2a2a48344b138b89d7
parent6fe3174119c8b6a1d337fb712fcba4e88ca4dc46 (diff)
downloadgstreamer-plugins-base-9d3eeab150e2b26cae8821d726502b38713a81d5.tar.gz
playsink: Add audio/videoconvert in front of the audio/video-filters
audioresample and videoscale is something the application will have to do if required, but we can at least help here by adding the audioconvert/videoconvert elements. https://bugzilla.gnome.org/show_bug.cgi?id=735748
-rw-r--r--gst/playback/gstplaysink.c52
1 files changed, 48 insertions, 4 deletions
diff --git a/gst/playback/gstplaysink.c b/gst/playback/gstplaysink.c
index f5a2d427b..b341dca31 100644
--- a/gst/playback/gstplaysink.c
+++ b/gst/playback/gstplaysink.c
@@ -99,6 +99,7 @@ typedef struct
GstPlayChain chain;
GstPad *sinkpad;
GstElement *queue;
+ GstElement *filter_conv;
GstElement *filter;
GstElement *conv;
GstElement *volume; /* element with the volume property */
@@ -123,6 +124,7 @@ typedef struct
GstPlayChain chain;
GstPad *sinkpad;
GstElement *queue;
+ GstElement *filter_conv;
GstElement *filter;
GstElement *conv;
GstElement *sink;
@@ -1824,8 +1826,29 @@ gen_video_chain (GstPlaySink * playsink, gboolean raw, gboolean async)
}
} else {
GST_DEBUG_OBJECT (playsink, "adding video filter");
+ chain->filter_conv =
+ gst_element_factory_make ("videoconvert", "filter-convert");
+ if (!chain->filter_conv) {
+ post_missing_element_message (playsink, "videoconvert");
+ GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "videoconvert"),
+ ("video playback and visualizations might not work"));
+ } else {
+ gst_bin_add (bin, chain->filter_conv);
+ head = prev = chain->filter_conv;
+ }
+
gst_bin_add (bin, chain->filter);
- head = prev = chain->filter;
+ if (prev) {
+ if (!gst_element_link_pads_full (prev, "src", chain->filter, "sink",
+ GST_PAD_LINK_CHECK_TEMPLATE_CAPS)) {
+ goto link_failed;
+ }
+ } else {
+ head = chain->filter;
+ }
+ prev = chain->filter;
}
}
@@ -2674,12 +2697,33 @@ gen_audio_chain (GstPlaySink * playsink, gboolean raw)
goto filter_with_nonraw;
} else {
GST_DEBUG_OBJECT (playsink,
- "skipping video filter since we're not raw");
+ "skipping audio filter since we're not raw");
}
} else {
- GST_DEBUG_OBJECT (playsink, "adding video filter");
+ GST_DEBUG_OBJECT (playsink, "adding audio filter");
+ chain->filter_conv =
+ gst_element_factory_make ("audioconvert", "filter-convert");
+ if (!chain->filter_conv) {
+ post_missing_element_message (playsink, "audioconvert");
+ GST_ELEMENT_WARNING (playsink, CORE, MISSING_PLUGIN,
+ (_("Missing element '%s' - check your GStreamer installation."),
+ "audioconvert"),
+ ("audio playback and visualizations might not work"));
+ } else {
+ gst_bin_add (bin, chain->filter_conv);
+ head = prev = chain->filter_conv;
+ }
+
gst_bin_add (bin, chain->filter);
- head = prev = chain->filter;
+ if (prev) {
+ if (!gst_element_link_pads_full (prev, "src", chain->filter, "sink",
+ GST_PAD_LINK_CHECK_TEMPLATE_CAPS)) {
+ goto link_failed;
+ }
+ } else {
+ head = chain->filter;
+ }
+ prev = chain->filter;
}
}