18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 */
24
25 #include "config.h"
26 #include "LibWebRTCMediaEndpoint.h"
27
28 #if USE(LIBWEBRTC)
29
30 #include "EventNames.h"
31 #include "JSRTCStatsReport.h"
32 #include "LibWebRTCDataChannelHandler.h"
33 #include "LibWebRTCPeerConnectionBackend.h"
34 #include "LibWebRTCProvider.h"
35 #include "Logging.h"
36 #include "MediaStreamEvent.h"
37 #include "NotImplemented.h"
38 #include "PlatformStrategies.h"
39 #include "RTCDataChannel.h"
40 #include "RTCDataChannelEvent.h"
41 #include "RTCOfferOptions.h"
42 #include "RTCPeerConnection.h"
43 #include "RTCSessionDescription.h"
44 #include "RTCStatsReport.h"
45 #include "RTCTrackEvent.h"
46 #include "RealtimeIncomingAudioSource.h"
47 #include "RealtimeIncomingVideoSource.h"
48 #include "RuntimeEnabledFeatures.h"
49 #include <webrtc/base/physicalsocketserver.h>
50 #include <webrtc/p2p/base/basicpacketsocketfactory.h>
51 #include <webrtc/p2p/client/basicportallocator.h>
52 #include <webrtc/pc/peerconnectionfactory.h>
53 #include <wtf/MainThread.h>
54
55 #include "CoreMediaSoftLink.h"
56
57 namespace WebCore {
58
59 LibWebRTCMediaEndpoint::LibWebRTCMediaEndpoint(LibWebRTCPeerConnectionBackend& peerConnection, LibWebRTCProvider& client)
60 : m_peerConnectionBackend(peerConnection)
61 , m_peerConnectionFactory(*client.factory())
62 , m_createSessionDescriptionObserver(*this)
63 , m_setLocalSessionDescriptionObserver(*this)
64 , m_setRemoteSessionDescriptionObserver(*this)
65 , m_statsLogTimer(*this, &LibWebRTCMediaEndpoint::gatherStatsForLogging)
66 {
67 ASSERT(client.factory());
68 }
69
70 bool LibWebRTCMediaEndpoint::setConfiguration(LibWebRTCProvider& client, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration)
71 {
72 if (!m_backend) {
286 if (protectedThis->m_backend)
287 protectedThis->m_backend->GetStats(collector.get());
288 });
289 }
290
291 LibWebRTCMediaEndpoint::StatsCollector::StatsCollector(Ref<LibWebRTCMediaEndpoint>&& endpoint, const DeferredPromise& promise, MediaStreamTrack* track)
292 : m_endpoint(WTFMove(endpoint))
293 , m_promise(promise)
294 {
295 if (track)
296 m_id = track->id();
297 }
298
299 static inline String fromStdString(const std::string& value)
300 {
301 return String(value.data(), value.length());
302 }
303
304 static inline void fillRTCStats(RTCStatsReport::Stats& stats, const webrtc::RTCStats& rtcStats)
305 {
306 stats.timestamp = rtcStats.timestamp_us() / 1000.0;
307 stats.id = fromStdString(rtcStats.id());
308 }
309
310 static inline void fillRTCRTPStreamStats(RTCStatsReport::RTCRTPStreamStats& stats, const webrtc::RTCRTPStreamStats& rtcStats)
311 {
312 fillRTCStats(stats, rtcStats);
313
314 if (rtcStats.ssrc.is_defined())
315 stats.ssrc = *rtcStats.ssrc;
316 if (rtcStats.associate_stats_id.is_defined())
317 stats.associateStatsId = fromStdString(*rtcStats.associate_stats_id);
318 if (rtcStats.is_remote.is_defined())
319 stats.isRemote = *rtcStats.is_remote;
320 if (rtcStats.media_type.is_defined())
321 stats.mediaType = fromStdString(*rtcStats.media_type);
322 if (rtcStats.track_id.is_defined())
323 stats.mediaTrackId = fromStdString(*rtcStats.track_id);
324 if (rtcStats.transport_id.is_defined())
325 stats.transportId = fromStdString(*rtcStats.transport_id);
326 if (rtcStats.codec_id.is_defined())
|
18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23 */
24
25 #include "config.h"
26 #include "LibWebRTCMediaEndpoint.h"
27
28 #if USE(LIBWEBRTC)
29
30 #include "EventNames.h"
31 #include "JSRTCStatsReport.h"
32 #include "LibWebRTCDataChannelHandler.h"
33 #include "LibWebRTCPeerConnectionBackend.h"
34 #include "LibWebRTCProvider.h"
35 #include "Logging.h"
36 #include "MediaStreamEvent.h"
37 #include "NotImplemented.h"
38 #include "Performance.h"
39 #include "PlatformStrategies.h"
40 #include "RTCDataChannel.h"
41 #include "RTCDataChannelEvent.h"
42 #include "RTCOfferOptions.h"
43 #include "RTCPeerConnection.h"
44 #include "RTCSessionDescription.h"
45 #include "RTCStatsReport.h"
46 #include "RTCTrackEvent.h"
47 #include "RealtimeIncomingAudioSource.h"
48 #include "RealtimeIncomingVideoSource.h"
49 #include "RuntimeEnabledFeatures.h"
50 #include <webrtc/base/physicalsocketserver.h>
51 #include <webrtc/p2p/base/basicpacketsocketfactory.h>
52 #include <webrtc/p2p/client/basicportallocator.h>
53 #include <webrtc/pc/peerconnectionfactory.h>
54 #include <wtf/CurrentTime.h>
55 #include <wtf/MainThread.h>
56
57 #include "CoreMediaSoftLink.h"
58
59 namespace WebCore {
60
61 LibWebRTCMediaEndpoint::LibWebRTCMediaEndpoint(LibWebRTCPeerConnectionBackend& peerConnection, LibWebRTCProvider& client)
62 : m_peerConnectionBackend(peerConnection)
63 , m_peerConnectionFactory(*client.factory())
64 , m_createSessionDescriptionObserver(*this)
65 , m_setLocalSessionDescriptionObserver(*this)
66 , m_setRemoteSessionDescriptionObserver(*this)
67 , m_statsLogTimer(*this, &LibWebRTCMediaEndpoint::gatherStatsForLogging)
68 {
69 ASSERT(client.factory());
70 }
71
72 bool LibWebRTCMediaEndpoint::setConfiguration(LibWebRTCProvider& client, webrtc::PeerConnectionInterface::RTCConfiguration&& configuration)
73 {
74 if (!m_backend) {
288 if (protectedThis->m_backend)
289 protectedThis->m_backend->GetStats(collector.get());
290 });
291 }
292
293 LibWebRTCMediaEndpoint::StatsCollector::StatsCollector(Ref<LibWebRTCMediaEndpoint>&& endpoint, const DeferredPromise& promise, MediaStreamTrack* track)
294 : m_endpoint(WTFMove(endpoint))
295 , m_promise(promise)
296 {
297 if (track)
298 m_id = track->id();
299 }
300
301 static inline String fromStdString(const std::string& value)
302 {
303 return String(value.data(), value.length());
304 }
305
306 static inline void fillRTCStats(RTCStatsReport::Stats& stats, const webrtc::RTCStats& rtcStats)
307 {
308 stats.timestamp = Performance::reduceTimeResolution(Seconds::fromMicroseconds(rtcStats.timestamp_us())).milliseconds();
309 stats.id = fromStdString(rtcStats.id());
310 }
311
312 static inline void fillRTCRTPStreamStats(RTCStatsReport::RTCRTPStreamStats& stats, const webrtc::RTCRTPStreamStats& rtcStats)
313 {
314 fillRTCStats(stats, rtcStats);
315
316 if (rtcStats.ssrc.is_defined())
317 stats.ssrc = *rtcStats.ssrc;
318 if (rtcStats.associate_stats_id.is_defined())
319 stats.associateStatsId = fromStdString(*rtcStats.associate_stats_id);
320 if (rtcStats.is_remote.is_defined())
321 stats.isRemote = *rtcStats.is_remote;
322 if (rtcStats.media_type.is_defined())
323 stats.mediaType = fromStdString(*rtcStats.media_type);
324 if (rtcStats.track_id.is_defined())
325 stats.mediaTrackId = fromStdString(*rtcStats.track_id);
326 if (rtcStats.transport_id.is_defined())
327 stats.transportId = fromStdString(*rtcStats.transport_id);
328 if (rtcStats.codec_id.is_defined())
|