Modified: trunk/Source/WebCore/ChangeLog (140684 => 140685)
--- trunk/Source/WebCore/ChangeLog 2013-01-24 16:08:51 UTC (rev 140684)
+++ trunk/Source/WebCore/ChangeLog 2013-01-24 16:16:42 UTC (rev 140685)
@@ -1,3 +1,22 @@
+2013-01-24 Victor Jaquez <[email protected]>
+
+ [GStreamer] Implement setPreservesPitch()
+ https://bugs.webkit.org/show_bug.cgi?id=31155
+
+ Enables audio pitch preservation by using the scaletempo GStreamer
+ element when required by the MediaPlayer.
+
+ Reviewed by Philippe Normand.
+
+ No new tests, but a layout test shall be implemented at some point
+ using WebAudio API.
+
+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp:
+ (WebCore::MediaPlayerPrivateGStreamer::setPreservesPitch):
+ (WebCore):
+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h:
+ (MediaPlayerPrivateGStreamer):
+
2013-01-24 Zoltan Arvai <[email protected]>
Removing deleted files from WebCore/Target.pri after r140399.
Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp (140684 => 140685)
--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp 2013-01-24 16:08:51 UTC (rev 140684)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.cpp 2013-01-24 16:16:42 UTC (rev 140685)
@@ -250,6 +250,7 @@
, m_webkitAudioSink(0)
, m_totalBytes(-1)
, m_originalPreloadWasAutoAndWasOverridden(false)
+ , m_preservesPitch(false)
{
}
@@ -740,6 +741,11 @@
g_object_set(m_playBin.get(), "mute", mute, NULL);
}
+void MediaPlayerPrivateGStreamer::setPreservesPitch(bool preservesPitch)
+{
+ m_preservesPitch = preservesPitch;
+}
+
MediaPlayer::NetworkState MediaPlayerPrivateGStreamer::networkState() const
{
return m_networkState;
@@ -1795,6 +1801,40 @@
}
}
+void MediaPlayerPrivateGStreamer::createAudioSink()
+{
+ // Construct audio sink if pitch preserving is enabled.
+ if (!m_preservesPitch)
+ return;
+
+ if (!m_playBin)
+ return;
+
+ GstElement* scale = gst_element_factory_make("scaletempo", 0);
+ if (!scale) {
+ GST_WARNING("Failed to create scaletempo");
+ return;
+ }
+
+ GstElement* convert = gst_element_factory_make("audioconvert", 0);
+ GstElement* resample = gst_element_factory_make("audioresample", 0);
+ GstElement* sink = gst_element_factory_make("autoaudiosink", 0);
+
+ GstElement* audioSink = gst_bin_new("audio-sink");
+ gst_bin_add_many(GST_BIN(audioSink), scale, convert, resample, sink, NULL);
+
+ if (!gst_element_link_many(scale, convert, resample, sink, NULL)) {
+ GST_WARNING("Failed to link audio sink elements");
+ gst_object_unref(audioSink);
+ return;
+ }
+
+ GRefPtr<GstPad> pad = adoptGRef(gst_element_get_static_pad(scale, "sink"));
+ gst_element_add_pad(audioSink, gst_ghost_pad_new("sink", pad.get()));
+
+ g_object_set(m_playBin.get(), "audio-sink", audioSink, NULL);
+}
+
void MediaPlayerPrivateGStreamer::createGSTPlayBin()
{
ASSERT(!m_playBin);
@@ -1830,7 +1870,7 @@
#ifndef GST_API_VERSION_1
- m_videoSinkBin = gst_bin_new("sink");
+ m_videoSinkBin = gst_bin_new("video-sink");
GstElement* videoTee = gst_element_factory_make("tee", "videoTee");
GstElement* queue = gst_element_factory_make("queue", 0);
@@ -1907,6 +1947,7 @@
if (videoSinkPad)
g_signal_connect(videoSinkPad.get(), "notify::caps", G_CALLBACK(mediaPlayerPrivateVideoSinkCapsChangedCallback), this);
+ createAudioSink();
}
}
Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h (140684 => 140685)
--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h 2013-01-24 16:08:51 UTC (rev 140684)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamer.h 2013-01-24 16:16:42 UTC (rev 140685)
@@ -72,6 +72,7 @@
void seek(float);
void setRate(float);
+ void setPreservesPitch(bool);
void setVolume(float);
void volumeChanged();
@@ -137,6 +138,7 @@
static bool isAvailable();
void updateAudioSink();
+ void createAudioSink();
float playbackPosition() const;
@@ -205,6 +207,7 @@
mutable IntSize m_videoSize;
KURL m_url;
bool m_originalPreloadWasAutoAndWasOverridden;
+ bool m_preservesPitch;
};
}