MediaEndpointOwr.h [plain text]
#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;
};
}
#endif // ENABLE(WEB_RTC)