Modified: trunk/Source/WebCore/ChangeLog (204117 => 204118)
--- trunk/Source/WebCore/ChangeLog 2016-08-04 07:56:37 UTC (rev 204117)
+++ trunk/Source/WebCore/ChangeLog 2016-08-04 09:26:16 UTC (rev 204118)
@@ -1,3 +1,42 @@
+2016-08-04 Alejandro G. Castro <[email protected]>
+
+ WebRTC: OWR: Add support for the muted state in the mediaplayer
+ https://bugs.webkit.org/show_bug.cgi?id=160502
+
+ Modified the load, play and stop methods to handle the new
+ situation where the mediaSource could be empty, until the remote
+ side sends the information to create the receiver.
+
+ Reviewed by Philippe Normand.
+
+ No new tests, we need to upstream the owr endpoint to check this
+ situation.
+
+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.cpp:
+ (WebCore::MediaPlayerPrivateGStreamerOwr::play): Check the muted
+ state of the tracks if required, we do it using the new
+ maybeHandleChangeMutedState function.
+ (WebCore::MediaPlayerPrivateGStreamerOwr::load): Add always the
+ observer of the track to check when it is unmuted, and we delay
+ enabling/setting the source until the play or the unmute.
+ (WebCore::MediaPlayerPrivateGStreamerOwr::internalLoad): Removed,
+ we now do all in the load method.
+ (WebCore::MediaPlayerPrivateGStreamerOwr::stop): Remove the
+ mediasource when disabling. Removed the m_stopped state, it was
+ there because the internalLoad was called multiple times.
+ (WebCore::MediaPlayerPrivateGStreamerOwr::trackMutedChanged):
+ Check the muted state and handle it, we use the new method
+ maybeHandleChangeMutedState.
+ (WebCore::MediaPlayerPrivateGStreamerOwr::maybeHandleChangeMutedState):
+ Check if the track is muted or not, in case it is muted disable
+ the the renderer and remove its mediasource. If it is not muted
+ enable the renderer and set the mediasource.
+ (WebCore::MediaPlayerPrivateGStreamerOwr::createVideoSink): Move
+ the workaround for the renderer to this method when it is created.
+ * platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.h:
+ Removed internalLoad method and the m_stopped attribute used to
+ call internalLoad multiple times.
+
2016-08-04 Youenn Fablet <[email protected]>
DocumentThreadableLoader should pass the fetch mode to underlying loader code
Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.cpp (204117 => 204118)
--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.cpp 2016-08-04 07:56:37 UTC (rev 204117)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.cpp 2016-08-04 09:26:16 UTC (rev 204118)
@@ -71,7 +71,17 @@
}
m_paused = false;
- internalLoad();
+
+ GST_DEBUG("Connecting to live stream, descriptor: %p", m_streamPrivate.get());
+
+ for (auto track : m_streamPrivate->tracks()) {
+ if (!track->enabled()) {
+ GST_DEBUG("Track %s disabled", track->label().ascii().data());
+ continue;
+ }
+
+ maybeHandleChangeMutedState(*track);
+ }
}
void MediaPlayerPrivateGStreamerOwr::pause()
@@ -132,10 +142,10 @@
if (!initializeGStreamer())
return;
- if (!m_videoSink)
+ if (streamPrivate.hasVideo() && !m_videoSink)
createVideoSink();
- if (!m_audioSink)
+ if (streamPrivate.hasAudio() && !m_audioSink)
createGSTAudioSinkBin();
GST_DEBUG("Loading MediaStreamPrivate %p", &streamPrivate);
@@ -151,48 +161,6 @@
m_player->networkStateChanged();
m_player->readyStateChanged();
- if (!internalLoad())
- return;
-
- // If the stream contains video, wait for first video frame before setting
- // HaveEnoughData.
- if (!hasVideo())
- m_readyState = MediaPlayer::HaveEnoughData;
-
- m_player->readyStateChanged();
-}
-
-void MediaPlayerPrivateGStreamerOwr::loadingFailed(MediaPlayer::NetworkState error)
-{
- if (m_networkState != error) {
- m_networkState = error;
- m_player->networkStateChanged();
- }
- if (m_readyState != MediaPlayer::HaveNothing) {
- m_readyState = MediaPlayer::HaveNothing;
- m_player->readyStateChanged();
- }
-}
-
-bool MediaPlayerPrivateGStreamerOwr::didLoadingProgress() const
-{
- // FIXME: Implement loading progress support.
- return true;
-}
-
-bool MediaPlayerPrivateGStreamerOwr::internalLoad()
-{
- if (!m_stopped)
- return false;
-
- m_stopped = false;
- if (!m_streamPrivate || !m_streamPrivate->active()) {
- loadingFailed(MediaPlayer::NetworkError);
- return false;
- }
-
- GST_DEBUG("Connecting to live stream, descriptor: %p", m_streamPrivate.get());
-
for (auto track : m_streamPrivate->tracks()) {
if (!track->enabled()) {
GST_DEBUG("Track %s disabled", track->label().ascii().data());
@@ -199,27 +167,14 @@
continue;
}
- OwrMediaSource* mediaSource = OWR_MEDIA_SOURCE(reinterpret_cast<RealtimeMediaSourceOwr*>(&track->source())->mediaSource());
+ track->addObserver(*this);
switch (track->type()) {
case RealtimeMediaSource::Audio:
- if (m_audioTrack && (m_audioTrack.get() == track))
- g_object_set(m_audioRenderer.get(), "disabled", FALSE, nullptr);
-
- owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_audioRenderer.get()), mediaSource);
m_audioTrack = track;
- track->addObserver(*this);
break;
case RealtimeMediaSource::Video:
- if (m_videoTrack && (m_videoTrack.get() == track))
- g_object_set(m_videoRenderer.get(), "disabled", FALSE, nullptr);
-
- // FIXME: Remove hardcoded video dimensions when the rendering performance:
- // https://webkit.org/b/153826.
- g_object_set(m_videoRenderer.get(), "width", 640, "height", 480, nullptr);
- owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_videoRenderer.get()), mediaSource);
m_videoTrack = track;
- track->addObserver(*this);
break;
case RealtimeMediaSource::None:
GST_WARNING("Loading a track with None type");
@@ -228,22 +183,37 @@
m_readyState = MediaPlayer::HaveEnoughData;
m_player->readyStateChanged();
+}
+
+void MediaPlayerPrivateGStreamerOwr::loadingFailed(MediaPlayer::NetworkState error)
+{
+ if (m_networkState != error) {
+ m_networkState = error;
+ m_player->networkStateChanged();
+ }
+ if (m_readyState != MediaPlayer::HaveNothing) {
+ m_readyState = MediaPlayer::HaveNothing;
+ m_player->readyStateChanged();
+ }
+}
+
+bool MediaPlayerPrivateGStreamerOwr::didLoadingProgress() const
+{
+ // FIXME: Implement loading progress support.
return true;
}
void MediaPlayerPrivateGStreamerOwr::stop()
{
- if (m_stopped)
- return;
-
- m_stopped = true;
if (m_audioTrack) {
GST_DEBUG("Stop: disconnecting audio");
g_object_set(m_audioRenderer.get(), "disabled", TRUE, nullptr);
+ owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_audioRenderer.get()), nullptr);
}
if (m_videoTrack) {
GST_DEBUG("Stop: disconnecting video");
g_object_set(m_videoRenderer.get(), "disabled", TRUE, nullptr);
+ owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_videoRenderer.get()), nullptr);
}
}
@@ -312,11 +282,42 @@
g_object_set(m_videoRenderer.get(), "disabled", TRUE, nullptr);
}
-void MediaPlayerPrivateGStreamerOwr::trackMutedChanged(MediaStreamTrackPrivate&)
+void MediaPlayerPrivateGStreamerOwr::trackMutedChanged(MediaStreamTrackPrivate& track)
{
GST_DEBUG("Track muted state changed");
+
+ maybeHandleChangeMutedState(track);
}
+void MediaPlayerPrivateGStreamerOwr::maybeHandleChangeMutedState(MediaStreamTrackPrivate& track)
+{
+ auto realTimeMediaSource = reinterpret_cast<RealtimeMediaSourceOwr*>(&track.source());
+ auto mediaSource = OWR_MEDIA_SOURCE(realTimeMediaSource->mediaSource());
+
+ switch (track.type()) {
+ case RealtimeMediaSource::Audio:
+ if (!realTimeMediaSource->muted()) {
+ g_object_set(m_audioRenderer.get(), "disabled", false, nullptr);
+ owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_audioRenderer.get()), mediaSource);
+ } else {
+ g_object_set(m_audioRenderer.get(), "disabled", true, nullptr);
+ owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_audioRenderer.get()), nullptr);
+ }
+ break;
+ case RealtimeMediaSource::Video:
+ if (!realTimeMediaSource->muted()) {
+ g_object_set(m_videoRenderer.get(), "disabled", false, nullptr);
+ owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_videoRenderer.get()), mediaSource);
+ } else {
+ g_object_set(m_videoRenderer.get(), "disabled", true, nullptr);
+ owr_media_renderer_set_source(OWR_MEDIA_RENDERER(m_videoRenderer.get()), nullptr);
+ }
+ break;
+ case RealtimeMediaSource::None:
+ GST_WARNING("Trying to change mute state of a track with None type");
+ }
+}
+
void MediaPlayerPrivateGStreamerOwr::trackSettingsChanged(MediaStreamTrackPrivate&)
{
GST_DEBUG("Track settings changed");
@@ -331,6 +332,11 @@
{
GstElement* sink = MediaPlayerPrivateGStreamerBase::createVideoSink();
m_videoRenderer = adoptGRef(owr_gst_video_renderer_new(sink));
+
+ // FIXME: Remove hardcoded video dimensions when the rendering performance:
+ // https://webkit.org/b/153826.
+ g_object_set(m_videoRenderer.get(), "width", 640, "height", 480, nullptr);
+
return sink;
}