MediaEndpointPeerConnection.h [plain text]
#ifndef MediaEndpointPeerConnection_h
#define MediaEndpointPeerConnection_h
#if ENABLE(WEB_RTC)
#include "MediaEndpoint.h"
#include "MediaEndpointSessionDescription.h"
#include "NotImplemented.h"
#include "PeerConnectionBackend.h"
#include <wtf/Function.h>
#include <wtf/RefPtr.h>
namespace WebCore {
class MediaStream;
class MediaStreamTrack;
class PeerMediaDescription;
class SDPProcessor;
typedef Vector<RefPtr<PeerMediaDescription>> MediaDescriptionVector;
typedef Vector<RefPtr<RTCRtpSender>> RtpSenderVector;
typedef Vector<RefPtr<RTCRtpTransceiver>> RtpTransceiverVector;
class MediaEndpointPeerConnection : public PeerConnectionBackend, public MediaEndpointClient {
public:
MediaEndpointPeerConnection(PeerConnectionBackendClient*);
void createOffer(RTCOfferOptions&, PeerConnection::SessionDescriptionPromise&&) override;
void createAnswer(RTCAnswerOptions&, PeerConnection::SessionDescriptionPromise&&) override;
void setLocalDescription(RTCSessionDescription&, PeerConnection::VoidPromise&&) override;
RefPtr<RTCSessionDescription> localDescription() const override;
RefPtr<RTCSessionDescription> currentLocalDescription() const override;
RefPtr<RTCSessionDescription> pendingLocalDescription() const override;
void setRemoteDescription(RTCSessionDescription&, PeerConnection::VoidPromise&&) override;
RefPtr<RTCSessionDescription> remoteDescription() const override;
RefPtr<RTCSessionDescription> currentRemoteDescription() const override;
RefPtr<RTCSessionDescription> pendingRemoteDescription() const override;
void setConfiguration(RTCConfiguration&) override;
void addIceCandidate(RTCIceCandidate&, PeerConnection::VoidPromise&&) override;
void getStats(MediaStreamTrack*, PeerConnection::StatsPromise&&) override;
Vector<RefPtr<MediaStream>> getRemoteStreams() const override;
RefPtr<RTCRtpReceiver> createReceiver(const String& transceiverMid, const String& trackKind, const String& trackId) override;
void replaceTrack(RTCRtpSender&, RefPtr<MediaStreamTrack>&&, PeerConnection::VoidPromise&&) override;
void stop() override;
bool isNegotiationNeeded() const override { return m_negotiationNeeded; };
void markAsNeedingNegotiation();
void clearNegotiationNeededState() override { m_negotiationNeeded = false; };
private:
void runTask(Function<void ()>&&);
void startRunningTasks();
void createOfferTask(RTCOfferOptions&, PeerConnection::SessionDescriptionPromise&);
void createAnswerTask(RTCAnswerOptions&, PeerConnection::SessionDescriptionPromise&);
void setLocalDescriptionTask(RefPtr<RTCSessionDescription>&&, PeerConnection::VoidPromise&);
void setRemoteDescriptionTask(RefPtr<RTCSessionDescription>&&, PeerConnection::VoidPromise&);
void addIceCandidateTask(RTCIceCandidate&, PeerConnection::VoidPromise&);
void replaceTrackTask(RTCRtpSender&, const String& mid, RefPtr<MediaStreamTrack>&&, PeerConnection::VoidPromise&);
bool localDescriptionTypeValidForState(RTCSessionDescription::SdpType) const;
bool remoteDescriptionTypeValidForState(RTCSessionDescription::SdpType) const;
MediaEndpointSessionDescription* internalLocalDescription() const;
MediaEndpointSessionDescription* internalRemoteDescription() const;
RefPtr<RTCSessionDescription> createRTCSessionDescription(MediaEndpointSessionDescription*) const;
void gotDtlsFingerprint(const String& fingerprint, const String& fingerprintFunction) override;
void gotIceCandidate(unsigned mdescIndex, RefPtr<IceCandidate>&&) override;
void doneGatheringCandidates(unsigned mdescIndex) override;
PeerConnectionBackendClient* m_client;
std::unique_ptr<MediaEndpoint> m_mediaEndpoint;
Function<void ()> m_initialDeferredTask;
std::unique_ptr<SDPProcessor> m_sdpProcessor;
Vector<RefPtr<MediaPayload>> m_defaultAudioPayloads;
Vector<RefPtr<MediaPayload>> m_defaultVideoPayloads;
String m_cname;
String m_iceUfrag;
String m_icePassword;
String m_dtlsFingerprint;
String m_dtlsFingerprintFunction;
unsigned m_sdpOfferSessionVersion { 0 };
unsigned m_sdpAnswerSessionVersion { 0 };
RefPtr<MediaEndpointSessionDescription> m_currentLocalDescription;
RefPtr<MediaEndpointSessionDescription> m_pendingLocalDescription;
RefPtr<MediaEndpointSessionDescription> m_currentRemoteDescription;
RefPtr<MediaEndpointSessionDescription> m_pendingRemoteDescription;
HashMap<String, RefPtr<MediaStream>> m_remoteStreamMap;
bool m_negotiationNeeded { false };
};
}
#endif // ENABLE(WEB_RTC)
#endif // MediaEndpointPeerConnection_h