blob: f31048c9ecfeee350ac29f6221acd0c2eadb90f7 [file] [log] [blame]
/*
* Copyright (C) 2015, 2016 Ericsson AB. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name of Ericsson nor the names of its contributors
* may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#pragma once
#if ENABLE(WEB_RTC)
#include "MediaEndpoint.h"
#include <owr/owr_session.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
typedef struct _OwrMediaSession OwrMediaSession;
typedef struct _OwrMediaSource OwrMediaSource;
typedef struct _OwrTransportAgent OwrTransportAgent;
namespace WebCore {
class RealtimeMediaSourceOwr;
class RTCConfigurationPrivate;
struct PeerMediaDescription;
class OwrTransceiver : public RefCounted<OwrTransceiver> {
public:
static Ref<OwrTransceiver> create(const String& mid, OwrSession* session)
{
return adoptRef(*new OwrTransceiver(mid, session));
}
virtual ~OwrTransceiver() { }
const String& mid() const { return m_mid; }
OwrSession* session() const { return m_session; }
OwrIceState owrIceState() const { return m_owrIceState; }
void setOwrIceState(OwrIceState state) { m_owrIceState = state; }
bool gotEndOfRemoteCandidates() const { return m_gotEndOfRemoteCandidates; }
void markGotEndOfRemoteCandidates() { m_gotEndOfRemoteCandidates = true; }
private:
OwrTransceiver(const String& mid, OwrSession* session)
: m_mid(mid)
, m_session(session)
{ }
String m_mid;
OwrSession* m_session;
OwrIceState m_owrIceState { OWR_ICE_STATE_DISCONNECTED };
bool m_gotEndOfRemoteCandidates { false };
};
class MediaEndpointOwr : public MediaEndpoint {
public:
MediaEndpointOwr(MediaEndpointClient&);
~MediaEndpointOwr();
void setConfiguration(MediaEndpointConfiguration&&) override;
void generateDtlsInfo() override;
MediaPayloadVector getDefaultAudioPayloads() override;
MediaPayloadVector getDefaultVideoPayloads() override;
MediaPayloadVector filterPayloads(const MediaPayloadVector& remotePayloads, const MediaPayloadVector& defaultPayloads) override;
UpdateResult updateReceiveConfiguration(MediaEndpointSessionConfiguration*, bool isInitiator) override;
UpdateResult updateSendConfiguration(MediaEndpointSessionConfiguration*, const RealtimeMediaSourceMap&, bool isInitiator) override;
void addRemoteCandidate(const IceCandidate&, const String& mid, const String& ufrag, const String& password) override;
Ref<RealtimeMediaSource> createMutedRemoteSource(const String& mid, RealtimeMediaSource::Type) override;
void replaceMutedRemoteSourceMid(const String&, const String&) final;
void replaceSendSource(RealtimeMediaSource&, const String& mid) override;
void stop() override;
size_t transceiverIndexForSession(OwrSession*) const;
const String& sessionMid(OwrSession*) const;
OwrTransceiver* matchTransceiverByMid(const String& mid) const;
void dispatchNewIceCandidate(const String& mid, IceCandidate&&);
void dispatchGatheringDone(const String& mid);
void processIceTransportStateChange(OwrSession*);
void dispatchDtlsFingerprint(gchar* privateKey, gchar* certificate, const String& fingerprint, const String& fingerprintFunction);
void unmuteRemoteSource(const String& mid, OwrMediaSource*);
private:
enum SessionType { SessionTypeMedia };
struct TransceiverConfig {
SessionType type;
bool isDtlsClient;
String mid;
};
std::unique_ptr<RTCDataChannelHandler> createDataChannelHandler(const String&, const RTCDataChannelInit&) final;
void prepareSession(OwrSession*, PeerMediaDescription*);
void prepareMediaSession(OwrMediaSession*, PeerMediaDescription*, bool isInitiator);
void ensureTransportAgentAndTransceivers(bool isInitiator, const Vector<TransceiverConfig>&);
void internalAddRemoteCandidate(OwrSession*, const IceCandidate&, const String& ufrag, const String& password);
std::optional<MediaEndpointConfiguration> m_configuration;
GRegex* m_helperServerRegEx;
OwrTransportAgent* m_transportAgent;
Vector<RefPtr<OwrTransceiver>> m_transceivers;
HashMap<String, RefPtr<RealtimeMediaSourceOwr>> m_mutedRemoteSources;
MediaEndpointClient& m_client;
unsigned m_numberOfReceivePreparedSessions;
unsigned m_numberOfSendPreparedSessions;
String m_dtlsPrivateKey;
String m_dtlsCertificate;
};
} // namespace WebCore
#endif // ENABLE(WEB_RTC)