Title: [204118] trunk/Source/WebCore
Revision
204118
Author
[email protected]
Date
2016-08-04 02:26:16 -0700 (Thu, 04 Aug 2016)

Log Message

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.

Modified Paths

Diff

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;
 }
 

Modified: trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.h (204117 => 204118)


--- trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.h	2016-08-04 07:56:37 UTC (rev 204117)
+++ trunk/Source/WebCore/platform/graphics/gstreamer/MediaPlayerPrivateGStreamerOwr.h	2016-08-04 09:26:16 UTC (rev 204118)
@@ -94,11 +94,10 @@
     static bool initializeGStreamerAndGStreamerDebugging();
     void createGSTAudioSinkBin();
     void loadingFailed(MediaPlayer::NetworkState error);
-    bool internalLoad();
     void stop();
+    void maybeHandleChangeMutedState(MediaStreamTrackPrivate&);
 
     bool m_paused { true };
-    bool m_stopped { true };
     RefPtr<MediaStreamTrackPrivate> m_videoTrack;
     RefPtr<MediaStreamTrackPrivate> m_audioTrack;
     GRefPtr<GstElement> m_audioSink;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to