blob: 196348e231ccac8e4b99568f09209f0a4d7fa466 [file] [log] [blame]
// Copyright (c) 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_WEBRTC_SET_DESCRIPTION_OBSERVER_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_WEBRTC_SET_DESCRIPTION_OBSERVER_H_
#include <memory>
#include <vector>
#include "base/macros.h"
#include "base/memory/scoped_refptr.h"
#include "base/single_thread_task_runner.h"
#include "third_party/blink/renderer/modules/modules_export.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_peer_connection_handler.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_rtp_receiver_impl.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_rtp_sender_impl.h"
#include "third_party/blink/renderer/modules/peerconnection/rtc_rtp_transceiver_impl.h"
#include "third_party/blink/renderer/modules/peerconnection/transceiver_state_surfacer.h"
#include "third_party/blink/renderer/modules/peerconnection/webrtc_media_stream_track_adapter_map.h"
#include "third_party/blink/renderer/platform/wtf/thread_safe_ref_counted.h"
#include "third_party/webrtc/api/jsep.h"
#include "third_party/webrtc/api/peer_connection_interface.h"
#include "third_party/webrtc/api/rtc_error.h"
#include "third_party/webrtc/api/rtp_receiver_interface.h"
#include "third_party/webrtc/api/scoped_refptr.h"
#include "third_party/webrtc/api/set_remote_description_observer_interface.h"
#include "third_party/webrtc/rtc_base/ref_count.h"
#include "third_party/webrtc/rtc_base/ref_counted_object.h"
namespace blink {
// Copies the session description.
// Note: At the time of writing, third_party/webrtc/pc/sdp_utils.h's
// webrtc::CloneSessionDescription() creates a copy that does not include
// candidates added with AddIceCandidate. This is why we need our own copy
// function, which copies everything.
std::unique_ptr<webrtc::SessionDescriptionInterface> CopySessionDescription(
const webrtc::SessionDescriptionInterface* description);
// The blink layer correspondent of the setLocalDescription() observer
// (webrtc::SetSessionDescriptionObserver) and setRemoteDescription() observer
// (webrtc::SetRemoteDescriptionObserverInterface). The implementation should
// process the state changes of the Set[Local/Remote]Description() by inspecting
// the updated States.
class MODULES_EXPORT WebRtcSetDescriptionObserver
: public WTF::ThreadSafeRefCounted<WebRtcSetDescriptionObserver> {
public:
// The states as they were when the operation finished on the webrtc signaling
// thread. Note that other operations may have occurred while jumping back to
// the main thread, but these must be handled separately.
struct MODULES_EXPORT States {
States();
States(States&& other);
~States();
States& operator=(States&& other);
webrtc::PeerConnectionInterface::SignalingState signaling_state;
blink::WebRTCSctpTransportSnapshot sctp_transport_state;
std::vector<blink::RtpTransceiverState> transceiver_states;
std::unique_ptr<webrtc::SessionDescriptionInterface>
pending_local_description;
std::unique_ptr<webrtc::SessionDescriptionInterface>
current_local_description;
std::unique_ptr<webrtc::SessionDescriptionInterface>
pending_remote_description;
std::unique_ptr<webrtc::SessionDescriptionInterface>
current_remote_description;
DISALLOW_COPY_AND_ASSIGN(States);
};
WebRtcSetDescriptionObserver();
// Invoked in a PostTask() on the main thread after the SetLocalDescription()
// or SetRemoteDescription() operation completed on the webrtc signaling
// thread.
virtual void OnSetDescriptionComplete(webrtc::RTCError error,
States states) = 0;
protected:
friend class WTF::ThreadSafeRefCounted<WebRtcSetDescriptionObserver>;
virtual ~WebRtcSetDescriptionObserver();
DISALLOW_COPY_AND_ASSIGN(WebRtcSetDescriptionObserver);
};
// Takes care of surfacing WebRtcSetDescriptionObserver::State information from
// the webrtc signaling thread to the main thread. With the state information
// obtained, invokes |observer_|'s
// WebRtcSetDescriptionObserver::OnSetDescriptionComplete() on the main thread.
//
// This implements the behavior
// of both WebRtcSetLocalDescriptionObserverHandler and
// WebRtcSetRemoteDescriptionObserverHandler, but these are put in different
// classes because local and remote description observers have different
// interfaces in webrtc.
class MODULES_EXPORT WebRtcSetDescriptionObserverHandlerImpl
: public WTF::ThreadSafeRefCounted<
WebRtcSetDescriptionObserverHandlerImpl> {
public:
WebRtcSetDescriptionObserverHandlerImpl(
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner,
scoped_refptr<webrtc::PeerConnectionInterface> pc,
scoped_refptr<blink::WebRtcMediaStreamTrackAdapterMap> track_adapter_map,
scoped_refptr<WebRtcSetDescriptionObserver> observer,
bool surface_receivers_only);
// Must be called on the webrtc signaling thread internally by the handler
// when the Set[Local/Remote]Description() operation finishes.
void OnSetDescriptionComplete(webrtc::RTCError error);
private:
friend class WTF::ThreadSafeRefCounted<
WebRtcSetDescriptionObserverHandlerImpl>;
virtual ~WebRtcSetDescriptionObserverHandlerImpl();
void OnSetDescriptionCompleteOnMainThread(
webrtc::RTCError error,
webrtc::PeerConnectionInterface::SignalingState signaling_state,
blink::TransceiverStateSurfacer transceiver_state_surfacer,
std::unique_ptr<webrtc::SessionDescriptionInterface>
pending_local_description,
std::unique_ptr<webrtc::SessionDescriptionInterface>
current_local_description,
std::unique_ptr<webrtc::SessionDescriptionInterface>
pending_remote_description,
std::unique_ptr<webrtc::SessionDescriptionInterface>
current_remote_description);
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner_;
scoped_refptr<webrtc::PeerConnectionInterface> pc_;
scoped_refptr<blink::WebRtcMediaStreamTrackAdapterMap> track_adapter_map_;
scoped_refptr<WebRtcSetDescriptionObserver> observer_;
bool surface_receivers_only_;
DISALLOW_COPY_AND_ASSIGN(WebRtcSetDescriptionObserverHandlerImpl);
};
// An implementation of webrtc::SetLocalDescriptionObserverInterface for
// performing the operations of WebRtcSetDescriptionObserverHandlerImpl.
class MODULES_EXPORT WebRtcSetLocalDescriptionObserverHandler
: public webrtc::SetLocalDescriptionObserverInterface {
public:
static scoped_refptr<WebRtcSetLocalDescriptionObserverHandler> Create(
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner,
scoped_refptr<webrtc::PeerConnectionInterface> pc,
scoped_refptr<blink::WebRtcMediaStreamTrackAdapterMap> track_adapter_map,
scoped_refptr<WebRtcSetDescriptionObserver> observer,
bool surface_receivers_only);
// webrtc::SetLocalDescriptionObserverInterface implementation. Implementation
// calls WebRtcSetDescriptionObserverHandlerImpl::OnSetDescriptionComplete().
void OnSetLocalDescriptionComplete(webrtc::RTCError error) override;
protected:
WebRtcSetLocalDescriptionObserverHandler(
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner,
scoped_refptr<webrtc::PeerConnectionInterface> pc,
scoped_refptr<blink::WebRtcMediaStreamTrackAdapterMap> track_adapter_map,
scoped_refptr<WebRtcSetDescriptionObserver> observer,
bool surface_receivers_only);
~WebRtcSetLocalDescriptionObserverHandler() override;
scoped_refptr<WebRtcSetDescriptionObserverHandlerImpl> handler_impl_;
DISALLOW_COPY_AND_ASSIGN(WebRtcSetLocalDescriptionObserverHandler);
};
// An implementation of webrtc::SetRemoteDescriptionObserverInterface for
// performing the operations of WebRtcSetDescriptionObserverHandlerImpl.
class MODULES_EXPORT WebRtcSetRemoteDescriptionObserverHandler
: public webrtc::SetRemoteDescriptionObserverInterface {
public:
static scoped_refptr<WebRtcSetRemoteDescriptionObserverHandler> Create(
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner,
scoped_refptr<webrtc::PeerConnectionInterface> pc,
scoped_refptr<blink::WebRtcMediaStreamTrackAdapterMap> track_adapter_map,
scoped_refptr<WebRtcSetDescriptionObserver> observer,
bool surface_receivers_only);
// webrtc::SetRemoteDescriptionObserverInterface implementation.
// Implementation calls
// WebRtcSetDescriptionObserverHandlerImpl::OnSetDescriptionComplete().
void OnSetRemoteDescriptionComplete(webrtc::RTCError error) override;
protected:
WebRtcSetRemoteDescriptionObserverHandler(
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner,
scoped_refptr<webrtc::PeerConnectionInterface> pc,
scoped_refptr<blink::WebRtcMediaStreamTrackAdapterMap> track_adapter_map,
scoped_refptr<WebRtcSetDescriptionObserver> observer,
bool surface_receivers_only);
~WebRtcSetRemoteDescriptionObserverHandler() override;
scoped_refptr<WebRtcSetDescriptionObserverHandlerImpl> handler_impl_;
DISALLOW_COPY_AND_ASSIGN(WebRtcSetRemoteDescriptionObserverHandler);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_WEBRTC_SET_DESCRIPTION_OBSERVER_H_