Changeset 244736 in webkit


Ignore:
Timestamp:
Apr 29, 2019 9:24:31 AM (5 years ago)
Author:
youenn@apple.com
Message:

RTCTrackEvent should be delayed until the whole remote description is set
https://bugs.webkit.org/show_bug.cgi?id=196808
<rdar://problem/49802649>

Reviewed by Eric Carlson.

Source/WebCore:

As per https://w3c.github.io/webrtc-pc/#set-description,
fire events just before resolving the setRemoteDescription promise.
This ensures that the exposed stream has all necessary tracks from the beginning.
Pending track events are created in LibWebRTCMediaEndpoint and stored in PeerConnectionBackend.

Covered by updated test.

  • Modules/mediastream/PeerConnectionBackend.cpp:

(WebCore::PeerConnectionBackend::setRemoteDescriptionSucceeded):
(WebCore::PeerConnectionBackend::setRemoteDescriptionFailed):
(WebCore::PeerConnectionBackend::addPendingTrackEvent):
(WebCore::PeerConnectionBackend::stop):

  • Modules/mediastream/PeerConnectionBackend.h:
  • Modules/mediastream/RTCPeerConnection.cpp:
  • Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:

(WebCore::LibWebRTCMediaEndpoint::addRemoteTrack):
(WebCore::LibWebRTCMediaEndpoint::addPendingTrackEvent):
(WebCore::LibWebRTCMediaEndpoint::newTransceiver):

  • Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h:

LayoutTests:

  • webrtc/video-addTrack.html:
Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r244728 r244736  
     12019-04-29  Youenn Fablet  <youenn@apple.com>
     2
     3        RTCTrackEvent should be delayed until the whole remote description is set
     4        https://bugs.webkit.org/show_bug.cgi?id=196808
     5        <rdar://problem/49802649>
     6
     7        Reviewed by Eric Carlson.
     8
     9        * webrtc/video-addTrack.html:
     10
    1112019-04-29  Javier Fernandez  <jfernandez@igalia.com>
    212
  • trunk/LayoutTests/webrtc/video-addTrack.html

    r235480 r244736  
    6161                        else
    6262                            assert_equals(trackEvent.track.id, stream.getAudioTracks()[0].id);
     63                        assert_equals(trackEvent.streams.length, 1);
     64                        assert_equals(trackEvent.streams[0].getTracks().length, 2);
    6365                    }, " track " + count + ", wait = " + waitForSecondTrack);
    6466                    if (count++ === (waitForSecondTrack ? 1 : 0))
  • trunk/Source/WebCore/ChangeLog

    r244731 r244736  
     12019-04-29  Youenn Fablet  <youenn@apple.com>
     2
     3        RTCTrackEvent should be delayed until the whole remote description is set
     4        https://bugs.webkit.org/show_bug.cgi?id=196808
     5        <rdar://problem/49802649>
     6
     7        Reviewed by Eric Carlson.
     8
     9        As per https://w3c.github.io/webrtc-pc/#set-description,
     10        fire events just before resolving the setRemoteDescription promise.
     11        This ensures that the exposed stream has all necessary tracks from the beginning.
     12        Pending track events are created in LibWebRTCMediaEndpoint and stored in PeerConnectionBackend.
     13
     14        Covered by updated test.
     15
     16        * Modules/mediastream/PeerConnectionBackend.cpp:
     17        (WebCore::PeerConnectionBackend::setRemoteDescriptionSucceeded):
     18        (WebCore::PeerConnectionBackend::setRemoteDescriptionFailed):
     19        (WebCore::PeerConnectionBackend::addPendingTrackEvent):
     20        (WebCore::PeerConnectionBackend::stop):
     21        * Modules/mediastream/PeerConnectionBackend.h:
     22        * Modules/mediastream/RTCPeerConnection.cpp:
     23        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
     24        (WebCore::LibWebRTCMediaEndpoint::addRemoteTrack):
     25        (WebCore::LibWebRTCMediaEndpoint::addPendingTrackEvent):
     26        (WebCore::LibWebRTCMediaEndpoint::newTransceiver):
     27        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h:
     28
    1292019-04-25  Carlos Garcia Campos  <cgarcia@igalia.com>
    230
  • trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.cpp

    r244724 r244736  
    4444#include "RTCPeerConnectionIceEvent.h"
    4545#include "RTCRtpCapabilities.h"
     46#include "RTCTrackEvent.h"
    4647#include "RuntimeEnabledFeatures.h"
    4748#include <wtf/text/StringBuilder.h>
     
    249250    ALWAYS_LOG(LOGIDENTIFIER, "Set remote description succeeded");
    250251
     252    ASSERT(!m_peerConnection.isClosed());
     253
     254    auto events = WTFMove(m_pendingTrackEvents);
     255    for (auto& event : events) {
     256        auto& track = event.track.get();
     257
     258        m_peerConnection.fireEvent(RTCTrackEvent::create(eventNames().trackEvent, Event::CanBubble::No, Event::IsCancelable::No, WTFMove(event.receiver), WTFMove(event.track), WTFMove(event.streams), WTFMove(event.transceiver)));
     259
     260        if (m_peerConnection.isClosed())
     261            return;
     262
     263        // FIXME: As per spec, we should set muted to 'false' when starting to receive the content from network.
     264        track.source().setMuted(false);
     265    }
     266
    251267    if (m_peerConnection.isClosed())
    252268        return;
     
    263279    ALWAYS_LOG(LOGIDENTIFIER, "Set remote description failed:", exception.message());
    264280
    265     if (m_peerConnection.isClosed())
    266         return;
    267 
     281    ASSERT(m_pendingTrackEvents.isEmpty());
     282    m_pendingTrackEvents.clear();
     283
     284    ASSERT(!m_peerConnection.isClosed());
    268285    ASSERT(m_setDescriptionPromise);
    269286
    270287    m_setDescriptionPromise->reject(WTFMove(exception));
    271288    m_setDescriptionPromise = WTF::nullopt;
     289}
     290
     291void PeerConnectionBackend::addPendingTrackEvent(PendingTrackEvent&& event)
     292{
     293    ASSERT(!m_peerConnection.isClosed());
     294    m_pendingTrackEvents.append(WTFMove(event));
    272295}
    273296
     
    492515    m_addIceCandidatePromise = WTF::nullopt;
    493516
     517    m_pendingTrackEvents.clear();
     518
    494519    doStop();
    495520}
  • trunk/Source/WebCore/Modules/mediastream/PeerConnectionBackend.h

    r244724 r244736  
    193193    String filterSDP(String&&) const;
    194194
     195    struct PendingTrackEvent {
     196        Ref<RTCRtpReceiver> receiver;
     197        Ref<MediaStreamTrack> track;
     198        Vector<RefPtr<MediaStream>> streams;
     199        RefPtr<RTCRtpTransceiver> transceiver;
     200    };
     201    void addPendingTrackEvent(PendingTrackEvent&&);
     202
    195203private:
    196204    virtual void doCreateOffer(RTCOfferOptions&&) = 0;
     
    222230    Vector<PendingICECandidate> m_pendingICECandidates;
    223231
     232    Vector<PendingTrackEvent> m_pendingTrackEvents;
     233
    224234#if !RELEASE_LOG_DISABLED
    225235    Ref<const Logger> m_logger;
  • trunk/Source/WebCore/Modules/mediastream/RTCPeerConnection.cpp

    r243887 r244736  
    5353#include "RTCPeerConnectionIceEvent.h"
    5454#include "RTCSessionDescription.h"
    55 #include "RTCTrackEvent.h"
    5655#include <wtf/CryptographicallyRandomNumber.h>
    5756#include <wtf/IsoMallocInlines.h>
  • trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp

    r244632 r244736  
    4848#include "RTCSessionDescription.h"
    4949#include "RTCStatsReport.h"
    50 #include "RTCTrackEvent.h"
    5150#include "RealtimeIncomingAudioSource.h"
    5251#include "RealtimeIncomingVideoSource.h"
     
    396395    receiver->setBackend(std::make_unique<LibWebRTCRtpReceiverBackend>(WTFMove(rtcReceiver)));
    397396    auto& track = receiver->track();
    398     fireTrackEvent(receiver.releaseNonNull(), track, rtcStreams, nullptr);
    399 }
    400 
    401 void LibWebRTCMediaEndpoint::fireTrackEvent(Ref<RTCRtpReceiver>&& receiver, MediaStreamTrack& track, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>& rtcStreams, RefPtr<RTCRtpTransceiver>&& transceiver)
     397    addPendingTrackEvent(receiver.releaseNonNull(), track, rtcStreams, nullptr);
     398}
     399
     400void LibWebRTCMediaEndpoint::addPendingTrackEvent(Ref<RTCRtpReceiver>&& receiver, MediaStreamTrack& track, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>& rtcStreams, RefPtr<RTCRtpTransceiver>&& transceiver)
    402401{
    403402    Vector<RefPtr<MediaStream>> streams;
     
    412411    m_remoteStreamsFromRemoteTrack.add(&track, WTFMove(streamIds));
    413412
    414     m_peerConnectionBackend.connection().fireEvent(RTCTrackEvent::create(eventNames().trackEvent,
    415         Event::CanBubble::No, Event::IsCancelable::No, WTFMove(receiver), &track, WTFMove(streams), WTFMove(transceiver)));
    416 
    417     // FIXME: As per spec, we should set muted to 'false' when starting to receive the content from network.
    418     track.source().setMuted(false);
     413    m_peerConnectionBackend.addPendingTrackEvent({ WTFMove(receiver), makeRef(track), WTFMove(streams), WTFMove(transceiver) });
    419414}
    420415
     
    491486        auto rtcReceiver = rtcTransceiver->receiver();
    492487        setExistingReceiverSourceTrack(transceiver->receiver().track().source(), *rtcReceiver);
    493         fireTrackEvent(makeRef(transceiver->receiver()), transceiver->receiver().track(), rtcReceiver->streams(), makeRef(*transceiver));
     488        addPendingTrackEvent(makeRef(transceiver->receiver()), transceiver->receiver().track(), rtcReceiver->streams(), makeRef(*transceiver));
    494489        return;
    495490    }
     
    502497    auto& newTransceiver = m_peerConnectionBackend.newRemoteTransceiver(std::make_unique<LibWebRTCRtpTransceiverBackend>(WTFMove(rtcTransceiver)), source.releaseNonNull());
    503498
    504     fireTrackEvent(makeRef(newTransceiver.receiver()), newTransceiver.receiver().track(), rtcReceiver->streams(), makeRef(newTransceiver));
     499    addPendingTrackEvent(makeRef(newTransceiver.receiver()), newTransceiver.receiver().track(), rtcReceiver->streams(), makeRef(newTransceiver));
    505500}
    506501
  • trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.h

    r244034 r244736  
    144144    void removeRemoteTrack(rtc::scoped_refptr<webrtc::RtpReceiverInterface>&&);
    145145
    146     void fireTrackEvent(Ref<RTCRtpReceiver>&&, MediaStreamTrack&, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&, RefPtr<RTCRtpTransceiver>&&);
     146    void addPendingTrackEvent(Ref<RTCRtpReceiver>&&, MediaStreamTrack&, const std::vector<rtc::scoped_refptr<webrtc::MediaStreamInterface>>&, RefPtr<RTCRtpTransceiver>&&);
    147147
    148148    template<typename T>
Note: See TracChangeset for help on using the changeset viewer.