Title: [260380] trunk
Revision
260380
Author
[email protected]
Date
2020-04-20 11:16:57 -0700 (Mon, 20 Apr 2020)

Log Message

MediaPlayerPrivateMediaStreamAVFObjC should start play a newly added audio track if it is playing
https://bugs.webkit.org/show_bug.cgi?id=210740

Reviewed by Eric Carlson.

Source/WebCore:

Before the patch, MediaPlayerPrivateMediaStreamAVFObjC was not calling play on the audio renderer when the audio renderer
was added after the MediaPlayerPrivateMediaStreamAVFObjC was asked to play.
This patch makes it so that, on configuration of an audio track, it will be asked to play if its MediaPlayerPrivateMediaStreamAVFObjC is playing.
Add internals API to be able to write a test.

Test: fast/mediastream/play-newly-added-audio-track.html

* html/track/AudioTrack.h:
* html/track/AudioTrack.idl:
* platform/graphics/AudioTrackPrivate.h:
(WebCore::AudioTrackPrivate::isBackedByMediaStreamTrack const):
* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::updateTracks):
* platform/mediastream/AudioTrackPrivateMediaStream.cpp:
(WebCore::AudioTrackPrivateMediaStream::play):
* platform/mediastream/AudioTrackPrivateMediaStream.h:
(isType):
* testing/Internals.cpp:
(WebCore::Internals::isMockRealtimeMediaSourceCenterEnabled):
(WebCore::Internals::shouldAudioTrackPlay):
* testing/Internals.h:
* testing/Internals.idl:

LayoutTests:

* fast/mediastream/play-newly-added-audio-track-expected.txt: Added.
* fast/mediastream/play-newly-added-audio-track.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (260379 => 260380)


--- trunk/LayoutTests/ChangeLog	2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/LayoutTests/ChangeLog	2020-04-20 18:16:57 UTC (rev 260380)
@@ -1,3 +1,13 @@
+2020-04-20  Youenn Fablet  <[email protected]>
+
+        MediaPlayerPrivateMediaStreamAVFObjC should start play a newly added audio track if it is playing
+        https://bugs.webkit.org/show_bug.cgi?id=210740
+
+        Reviewed by Eric Carlson.
+
+        * fast/mediastream/play-newly-added-audio-track-expected.txt: Added.
+        * fast/mediastream/play-newly-added-audio-track.html: Added.
+
 2020-04-20  Zalan Bujtas  <[email protected]>
 
         fast/layoutformattingcontext/simple-absolute-positioned-replaced-inline-element-with-percentage-height.html is flaky

Added: trunk/LayoutTests/fast/mediastream/play-newly-added-audio-track-expected.txt (0 => 260380)


--- trunk/LayoutTests/fast/mediastream/play-newly-added-audio-track-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/fast/mediastream/play-newly-added-audio-track-expected.txt	2020-04-20 18:16:57 UTC (rev 260380)
@@ -0,0 +1,5 @@
+
+
+PASS Add an audio track while playing video 
+PASS Add an audio track while playing audio 
+

Added: trunk/LayoutTests/fast/mediastream/play-newly-added-audio-track.html (0 => 260380)


--- trunk/LayoutTests/fast/mediastream/play-newly-added-audio-track.html	                        (rev 0)
+++ trunk/LayoutTests/fast/mediastream/play-newly-added-audio-track.html	2020-04-20 18:16:57 UTC (rev 260380)
@@ -0,0 +1,34 @@
+<!DOCTYPE html>
+<html>
+    <head>
+        <video id="video" autoplay controls></video>
+        <script src=""
+        <script src=""
+        <script>
+promise_test(async () => {
+    let stream = await navigator.mediaDevices.getUserMedia({ video : true });
+    video.srcObject = stream;
+
+    await video.play();
+
+    let stream2 = await navigator.mediaDevices.getUserMedia({ audio : true });
+    video.srcObject.addTrack(stream2.getAudioTracks()[0]);
+
+    if (window.internals)
+        assert_true(internals.shouldAudioTrackPlay(video.audioTracks[0]));
+}, "Add an audio track while playing video");
+
+promise_test(async () => {
+    let stream = await navigator.mediaDevices.getUserMedia({ audio : true });
+    video.srcObject = stream.clone();
+
+    await video.play();
+
+    video.srcObject.addTrack(stream.getAudioTracks()[0]);
+    await new Promise(resolve => setTimeout(resolve, 50));
+    if (window.internals)
+        assert_true(internals.shouldAudioTrackPlay(video.audioTracks[1]));
+}, "Add an audio track while playing audio");
+        </script>
+    </head>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (260379 => 260380)


--- trunk/Source/WebCore/ChangeLog	2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/ChangeLog	2020-04-20 18:16:57 UTC (rev 260380)
@@ -1,5 +1,35 @@
 2020-04-20  Youenn Fablet  <[email protected]>
 
+        MediaPlayerPrivateMediaStreamAVFObjC should start play a newly added audio track if it is playing
+        https://bugs.webkit.org/show_bug.cgi?id=210740
+
+        Reviewed by Eric Carlson.
+
+        Before the patch, MediaPlayerPrivateMediaStreamAVFObjC was not calling play on the audio renderer when the audio renderer
+        was added after the MediaPlayerPrivateMediaStreamAVFObjC was asked to play.
+        This patch makes it so that, on configuration of an audio track, it will be asked to play if its MediaPlayerPrivateMediaStreamAVFObjC is playing.
+        Add internals API to be able to write a test.
+
+        Test: fast/mediastream/play-newly-added-audio-track.html
+
+        * html/track/AudioTrack.h:
+        * html/track/AudioTrack.idl:
+        * platform/graphics/AudioTrackPrivate.h:
+        (WebCore::AudioTrackPrivate::isBackedByMediaStreamTrack const):
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::updateTracks):
+        * platform/mediastream/AudioTrackPrivateMediaStream.cpp:
+        (WebCore::AudioTrackPrivateMediaStream::play):
+        * platform/mediastream/AudioTrackPrivateMediaStream.h:
+        (isType):
+        * testing/Internals.cpp:
+        (WebCore::Internals::isMockRealtimeMediaSourceCenterEnabled):
+        (WebCore::Internals::shouldAudioTrackPlay):
+        * testing/Internals.h:
+        * testing/Internals.idl:
+
+2020-04-20  Youenn Fablet  <[email protected]>
+
         Use a WeakHashSet to store MediaStreamPrivate observers
         https://bugs.webkit.org/show_bug.cgi?id=210494
 

Modified: trunk/Source/WebCore/html/track/AudioTrack.h (260379 => 260380)


--- trunk/Source/WebCore/html/track/AudioTrack.h	2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/html/track/AudioTrack.h	2020-04-20 18:16:57 UTC (rev 260380)
@@ -64,7 +64,9 @@
 
     size_t inbandTrackIndex() const;
 
+    const AudioTrackPrivate& privateTrack() const { return m_private; }
     void setPrivate(AudioTrackPrivate&);
+
     void setMediaElement(WeakPtr<HTMLMediaElement>) override;
 #if !RELEASE_LOG_DISABLED
     void setLogger(const Logger&, const void*) final;

Modified: trunk/Source/WebCore/html/track/AudioTrack.idl (260379 => 260380)


--- trunk/Source/WebCore/html/track/AudioTrack.idl	2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/html/track/AudioTrack.idl	2020-04-20 18:16:57 UTC (rev 260380)
@@ -25,6 +25,7 @@
 
 [
     Conditional=VIDEO_TRACK,
+    ExportMacro=WEBCORE_EXPORT,
     GenerateIsReachable=ImplElementRoot,
     JSCustomMarkFunction
 ] interface AudioTrack {

Modified: trunk/Source/WebCore/platform/graphics/AudioTrackPrivate.h (260379 => 260380)


--- trunk/Source/WebCore/platform/graphics/AudioTrackPrivate.h	2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/platform/graphics/AudioTrackPrivate.h	2020-04-20 18:16:57 UTC (rev 260380)
@@ -62,6 +62,8 @@
     enum Kind { Alternative, Description, Main, MainDesc, Translation, Commentary, None };
     virtual Kind kind() const { return None; }
 
+    virtual bool isBackedByMediaStreamTrack() const { return false; }
+
 #if !RELEASE_LOG_DISABLED
     const char* logClassName() const override { return "AudioTrackPrivate"; }
 #endif

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (260379 => 260380)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2020-04-20 18:16:57 UTC (rev 260380)
@@ -895,8 +895,11 @@
             break;
         case TrackState::Configure:
             track.setTrackIndex(index);
-            bool enabled = track.streamTrack().enabled() && !track.streamTrack().muted();
-            track.setEnabled(enabled);
+            track.setVolume(m_volume);
+            track.setMuted(m_muted);
+            track.setEnabled(track.streamTrack().enabled() && !track.streamTrack().muted());
+            if (playing())
+                track.play();
             break;
         }
     };

Modified: trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp (260379 => 260380)


--- trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp	2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp	2020-04-20 18:16:57 UTC (rev 260380)
@@ -72,6 +72,9 @@
 
 void AudioTrackPrivateMediaStream::play()
 {
+    if (m_shouldPlay)
+        return;
+
     m_shouldPlay = true;
     updateRenderer();
 }

Modified: trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h (260379 => 260380)


--- trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h	2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h	2020-04-20 18:16:57 UTC (rev 260380)
@@ -54,7 +54,8 @@
 
     void play();
     void pause();
-    bool isPlaying() { return m_isPlaying; }
+    bool isPlaying() const { return m_isPlaying; }
+    bool shouldPlay() const { return m_shouldPlay; }
 
     void setVolume(float);
     float volume() const;
@@ -75,6 +76,7 @@
     AtomString id() const final { return m_id; }
     AtomString label() const final { return m_label; }
     int trackIndex() const final { return m_index; }
+    bool isBackedByMediaStreamTrack() const final { return true; }
 
     // MediaStreamTrackPrivate::Observer
     void trackEnded(MediaStreamTrackPrivate&) final;
@@ -107,4 +109,8 @@
 
 }
 
+SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::AudioTrackPrivateMediaStream)
+    static bool isType(const WebCore::AudioTrackPrivate& track) { return track.isBackedByMediaStreamTrack(); }
+SPECIALIZE_TYPE_TRAITS_END()
+
 #endif // ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/testing/Internals.cpp (260379 => 260380)


--- trunk/Source/WebCore/testing/Internals.cpp	2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/testing/Internals.cpp	2020-04-20 18:16:57 UTC (rev 260380)
@@ -32,6 +32,7 @@
 #include "AnimationTimeline.h"
 #include "ApplicationCacheStorage.h"
 #include "AudioSession.h"
+#include "AudioTrackPrivateMediaStream.h"
 #include "Autofill.h"
 #include "BackForwardCache.h"
 #include "BackForwardController.h"
@@ -5076,6 +5077,13 @@
 {
     return MockRealtimeMediaSourceCenter::mockRealtimeMediaSourceCenterEnabled();
 }
+
+bool Internals::shouldAudioTrackPlay(const AudioTrack& track)
+{
+    if (!is<AudioTrackPrivateMediaStream>(track.privateTrack()))
+        return false;
+    return downcast<AudioTrackPrivateMediaStream>(track.privateTrack()).shouldPlay();
+}
 #endif
 
 bool Internals::supportsAudioSession() const

Modified: trunk/Source/WebCore/testing/Internals.h (260379 => 260380)


--- trunk/Source/WebCore/testing/Internals.h	2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/testing/Internals.h	2020-04-20 18:16:57 UTC (rev 260380)
@@ -52,6 +52,7 @@
 
 class AnimationTimeline;
 class AudioContext;
+class AudioTrack;
 class CacheStorageConnection;
 class DOMRect;
 class DOMRectList;
@@ -764,6 +765,7 @@
     void setMediaStreamTrackIdentifier(MediaStreamTrack&, String&& id);
     void setMediaStreamSourceInterrupted(MediaStreamTrack&, bool);
     bool isMockRealtimeMediaSourceCenterEnabled();
+    bool shouldAudioTrackPlay(const AudioTrack&);
 #endif
 
     bool supportsAudioSession() const;

Modified: trunk/Source/WebCore/testing/Internals.idl (260379 => 260380)


--- trunk/Source/WebCore/testing/Internals.idl	2020-04-20 18:14:37 UTC (rev 260379)
+++ trunk/Source/WebCore/testing/Internals.idl	2020-04-20 18:16:57 UTC (rev 260380)
@@ -777,6 +777,7 @@
     [Conditional=MEDIA_STREAM] void setMediaStreamTrackIdentifier(MediaStreamTrack track, DOMString identifier);
     [Conditional=MEDIA_STREAM] void setMediaStreamSourceInterrupted(MediaStreamTrack track, boolean interrupted);
     [Conditional=MEDIA_STREAM] boolean isMockRealtimeMediaSourceCenterEnabled();
+    [Conditional=MEDIA_STREAM] boolean shouldAudioTrackPlay(AudioTrack track);
 
     unsigned long long documentIdentifier(Document document);
     boolean isDocumentAlive(unsigned long long documentIdentifier);
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to