summaryrefslogtreecommitdiff
path: root/chromium/content/renderer/media/webrtc/rtc_rtp_transceiver.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/content/renderer/media/webrtc/rtc_rtp_transceiver.cc')
-rw-r--r--chromium/content/renderer/media/webrtc/rtc_rtp_transceiver.cc382
1 files changed, 0 insertions, 382 deletions
diff --git a/chromium/content/renderer/media/webrtc/rtc_rtp_transceiver.cc b/chromium/content/renderer/media/webrtc/rtc_rtp_transceiver.cc
deleted file mode 100644
index ab36db44b25..00000000000
--- a/chromium/content/renderer/media/webrtc/rtc_rtp_transceiver.cc
+++ /dev/null
@@ -1,382 +0,0 @@
-// Copyright 2018 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.
-
-#include "content/renderer/media/webrtc/rtc_rtp_transceiver.h"
-
-#include "base/bind.h"
-#include "base/logging.h"
-#include "base/memory/ref_counted.h"
-
-namespace content {
-
-RtpTransceiverState::RtpTransceiverState(
- scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
- scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner,
- scoped_refptr<webrtc::RtpTransceiverInterface> webrtc_transceiver,
- base::Optional<RtpSenderState> sender_state,
- base::Optional<RtpReceiverState> receiver_state,
- base::Optional<std::string> mid,
- bool stopped,
- webrtc::RtpTransceiverDirection direction,
- base::Optional<webrtc::RtpTransceiverDirection> current_direction,
- base::Optional<webrtc::RtpTransceiverDirection> fired_direction)
- : main_task_runner_(std::move(main_task_runner)),
- signaling_task_runner_(std::move(signaling_task_runner)),
- webrtc_transceiver_(std::move(webrtc_transceiver)),
- is_initialized_(false),
- sender_state_(std::move(sender_state)),
- receiver_state_(std::move(receiver_state)),
- mid_(std::move(mid)),
- stopped_(std::move(stopped)),
- direction_(std::move(direction)),
- current_direction_(std::move(current_direction)),
- fired_direction_(std::move(fired_direction)) {
- DCHECK(main_task_runner_);
- DCHECK(signaling_task_runner_);
- DCHECK(webrtc_transceiver_);
-}
-
-RtpTransceiverState::RtpTransceiverState(RtpTransceiverState&& other)
- : main_task_runner_(other.main_task_runner_),
- signaling_task_runner_(other.signaling_task_runner_),
- webrtc_transceiver_(std::move(other.webrtc_transceiver_)),
- is_initialized_(other.is_initialized_),
- sender_state_(std::move(other.sender_state_)),
- receiver_state_(std::move(other.receiver_state_)),
- mid_(std::move(other.mid_)),
- stopped_(std::move(other.stopped_)),
- direction_(std::move(other.direction_)),
- current_direction_(std::move(other.current_direction_)),
- fired_direction_(std::move(other.fired_direction_)) {
- // Explicitly null |other|'s task runners for use in destructor.
- other.main_task_runner_ = nullptr;
- other.signaling_task_runner_ = nullptr;
-}
-
-RtpTransceiverState::~RtpTransceiverState() {
- // It's OK to not be on the main thread if this state has been moved, in which
- // case |main_task_runner_| is null.
- DCHECK(!main_task_runner_ || main_task_runner_->BelongsToCurrentThread());
-}
-
-RtpTransceiverState& RtpTransceiverState::operator=(
- RtpTransceiverState&& other) {
- DCHECK_EQ(main_task_runner_, other.main_task_runner_);
- DCHECK_EQ(signaling_task_runner_, other.signaling_task_runner_);
- // Need to be on main thread for sender/receiver state's destructor that can
- // be triggered by replacing .
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- // Explicitly null |other|'s task runners for use in destructor.
- other.main_task_runner_ = nullptr;
- other.signaling_task_runner_ = nullptr;
- webrtc_transceiver_ = std::move(other.webrtc_transceiver_);
- is_initialized_ = other.is_initialized_;
- sender_state_ = std::move(other.sender_state_);
- receiver_state_ = std::move(other.receiver_state_);
- mid_ = std::move(other.mid_);
- stopped_ = std::move(other.stopped_);
- direction_ = std::move(other.direction_);
- current_direction_ = std::move(other.current_direction_);
- fired_direction_ = std::move(other.fired_direction_);
- return *this;
-}
-
-bool RtpTransceiverState::is_initialized() const {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return is_initialized_;
-}
-
-void RtpTransceiverState::Initialize() {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- if (sender_state_)
- sender_state_->Initialize();
- if (receiver_state_)
- receiver_state_->Initialize();
- is_initialized_ = true;
-}
-
-scoped_refptr<base::SingleThreadTaskRunner>
-RtpTransceiverState::main_task_runner() const {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return main_task_runner_;
-}
-
-scoped_refptr<base::SingleThreadTaskRunner>
-RtpTransceiverState::signaling_task_runner() const {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return signaling_task_runner_;
-}
-
-scoped_refptr<webrtc::RtpTransceiverInterface>
-RtpTransceiverState::webrtc_transceiver() const {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return webrtc_transceiver_;
-}
-
-const base::Optional<RtpSenderState>& RtpTransceiverState::sender_state()
- const {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return sender_state_;
-}
-
-RtpSenderState RtpTransceiverState::MoveSenderState() {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- base::Optional<RtpSenderState> temp(base::nullopt);
- sender_state_.swap(temp);
- return *std::move(temp);
-}
-
-const base::Optional<RtpReceiverState>& RtpTransceiverState::receiver_state()
- const {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return receiver_state_;
-}
-
-RtpReceiverState RtpTransceiverState::MoveReceiverState() {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- base::Optional<RtpReceiverState> temp(base::nullopt);
- receiver_state_.swap(temp);
- return *std::move(temp);
-}
-
-base::Optional<std::string> RtpTransceiverState::mid() const {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return mid_;
-}
-
-bool RtpTransceiverState::stopped() const {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return stopped_;
-}
-
-webrtc::RtpTransceiverDirection RtpTransceiverState::direction() const {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return direction_;
-}
-
-void RtpTransceiverState::set_direction(
- webrtc::RtpTransceiverDirection direction) {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- direction_ = direction;
-}
-
-base::Optional<webrtc::RtpTransceiverDirection>
-RtpTransceiverState::current_direction() const {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return current_direction_;
-}
-
-base::Optional<webrtc::RtpTransceiverDirection>
-RtpTransceiverState::fired_direction() const {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return fired_direction_;
-}
-
-class RTCRtpTransceiver::RTCRtpTransceiverInternal
- : public base::RefCountedThreadSafe<
- RTCRtpTransceiver::RTCRtpTransceiverInternal,
- RTCRtpTransceiver::RTCRtpTransceiverInternalTraits> {
- public:
- RTCRtpTransceiverInternal(
- scoped_refptr<webrtc::PeerConnectionInterface> native_peer_connection,
- scoped_refptr<WebRtcMediaStreamTrackAdapterMap> track_map,
- RtpTransceiverState state)
- : main_task_runner_(state.main_task_runner()),
- signaling_task_runner_(state.signaling_task_runner()),
- webrtc_transceiver_(state.webrtc_transceiver()),
- state_(std::move(state)) {
- sender_ = std::make_unique<RTCRtpSender>(native_peer_connection, track_map,
- state_.MoveSenderState());
- receiver_ = std::make_unique<RTCRtpReceiver>(native_peer_connection,
- state_.MoveReceiverState());
- }
-
- const RtpTransceiverState& state() const {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return state_;
- }
-
- void set_state(RtpTransceiverState state,
- TransceiverStateUpdateMode update_mode) {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- DCHECK_EQ(state.main_task_runner(), main_task_runner_);
- DCHECK_EQ(state.signaling_task_runner(), signaling_task_runner_);
- DCHECK(state.webrtc_transceiver() == webrtc_transceiver_);
- DCHECK(state.is_initialized());
- auto previous_direction = state_.direction();
- state_ = std::move(state);
- auto sender_state = state_.MoveSenderState();
- if (update_mode == TransceiverStateUpdateMode::kSetDescription) {
- // setLocalDescription() and setRemoteDescription() cannot modify
- // "sender.track" or "direction", so this part of the state information is
- // either identical to the current state or out-dated information.
- // Surfacing out-dated information has caused crashes and other problems,
- // see https://crbug.com/950280.
- sender_state.set_track_ref(sender_->state().track_ref()
- ? sender_->state().track_ref()->Copy()
- : nullptr);
- state_.set_direction(previous_direction);
- }
- sender_->set_state(std::move(sender_state));
- receiver_->set_state(state_.MoveReceiverState());
- }
-
- RTCRtpSender* content_sender() {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return sender_.get();
- }
-
- RTCRtpReceiver* content_receiver() {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- return receiver_.get();
- }
-
- void SetDirection(webrtc::RtpTransceiverDirection direction) {
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- // This implicitly performs a blocking invoke on the webrtc signaling thread
- // due to use of PROXY references for |webrtc_transceiver_|.
- webrtc_transceiver_->SetDirection(direction);
- state_.set_direction(webrtc_transceiver_->direction());
- }
-
- webrtc::RTCError setCodecPreferences(
- std::vector<webrtc::RtpCodecCapability> codec_preferences) {
- return webrtc_transceiver_->SetCodecPreferences(codec_preferences);
- }
-
- private:
- friend struct RTCRtpTransceiver::RTCRtpTransceiverInternalTraits;
-
- ~RTCRtpTransceiverInternal() {
- // Ensured by destructor traits.
- DCHECK(main_task_runner_->BelongsToCurrentThread());
- }
-
- // Task runners and webrtc transceiver: Same information as stored in |state_|
- // but const and safe to touch on the signaling thread to avoid race with
- // set_state().
- const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
- const scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner_;
- const scoped_refptr<webrtc::RtpTransceiverInterface> webrtc_transceiver_;
- RtpTransceiverState state_;
- std::unique_ptr<RTCRtpSender> sender_;
- std::unique_ptr<RTCRtpReceiver> receiver_;
-};
-
-struct RTCRtpTransceiver::RTCRtpTransceiverInternalTraits {
- private:
- friend class base::RefCountedThreadSafe<RTCRtpTransceiverInternal,
- RTCRtpTransceiverInternalTraits>;
-
- static void Destruct(const RTCRtpTransceiverInternal* transceiver) {
- // RTCRtpTransceiverInternal owns AdapterRefs which have to be destroyed on
- // the main thread, this ensures delete always happens there.
- if (!transceiver->main_task_runner_->BelongsToCurrentThread()) {
- transceiver->main_task_runner_->PostTask(
- FROM_HERE,
- base::BindOnce(
- &RTCRtpTransceiver::RTCRtpTransceiverInternalTraits::Destruct,
- base::Unretained(transceiver)));
- return;
- }
- delete transceiver;
- }
-};
-
-uintptr_t RTCRtpTransceiver::GetId(
- const webrtc::RtpTransceiverInterface* webrtc_transceiver) {
- return reinterpret_cast<uintptr_t>(webrtc_transceiver);
-}
-
-RTCRtpTransceiver::RTCRtpTransceiver(
- scoped_refptr<webrtc::PeerConnectionInterface> native_peer_connection,
- scoped_refptr<WebRtcMediaStreamTrackAdapterMap> track_map,
- RtpTransceiverState transceiver_state)
- : internal_(new RTCRtpTransceiverInternal(std::move(native_peer_connection),
- std::move(track_map),
- std::move(transceiver_state))) {}
-
-RTCRtpTransceiver::RTCRtpTransceiver(const RTCRtpTransceiver& other)
- : internal_(other.internal_) {}
-
-RTCRtpTransceiver::~RTCRtpTransceiver() {}
-
-RTCRtpTransceiver& RTCRtpTransceiver::operator=(
- const RTCRtpTransceiver& other) {
- internal_ = other.internal_;
- return *this;
-}
-
-std::unique_ptr<RTCRtpTransceiver> RTCRtpTransceiver::ShallowCopy() const {
- return std::make_unique<RTCRtpTransceiver>(*this);
-}
-
-const RtpTransceiverState& RTCRtpTransceiver::state() const {
- return internal_->state();
-}
-
-RTCRtpSender* RTCRtpTransceiver::content_sender() {
- return internal_->content_sender();
-}
-
-RTCRtpReceiver* RTCRtpTransceiver::content_receiver() {
- return internal_->content_receiver();
-}
-
-void RTCRtpTransceiver::set_state(RtpTransceiverState transceiver_state,
- TransceiverStateUpdateMode update_mode) {
- internal_->set_state(std::move(transceiver_state), update_mode);
-}
-
-blink::WebRTCRtpTransceiverImplementationType
-RTCRtpTransceiver::ImplementationType() const {
- return blink::WebRTCRtpTransceiverImplementationType::kFullTransceiver;
-}
-
-uintptr_t RTCRtpTransceiver::Id() const {
- return GetId(internal_->state().webrtc_transceiver().get());
-}
-
-blink::WebString RTCRtpTransceiver::Mid() const {
- const auto& mid = internal_->state().mid();
- return mid ? blink::WebString::FromUTF8(*mid)
- : blink::WebString(); // IsNull()
-}
-
-std::unique_ptr<blink::WebRTCRtpSender> RTCRtpTransceiver::Sender() const {
- return internal_->content_sender()->ShallowCopy();
-}
-
-std::unique_ptr<blink::WebRTCRtpReceiver> RTCRtpTransceiver::Receiver() const {
- return internal_->content_receiver()->ShallowCopy();
-}
-
-bool RTCRtpTransceiver::Stopped() const {
- return internal_->state().stopped();
-}
-
-webrtc::RtpTransceiverDirection RTCRtpTransceiver::Direction() const {
- return internal_->state().direction();
-}
-
-void RTCRtpTransceiver::SetDirection(
- webrtc::RtpTransceiverDirection direction) {
- internal_->SetDirection(direction);
-}
-
-base::Optional<webrtc::RtpTransceiverDirection>
-RTCRtpTransceiver::CurrentDirection() const {
- return internal_->state().current_direction();
-}
-
-base::Optional<webrtc::RtpTransceiverDirection>
-RTCRtpTransceiver::FiredDirection() const {
- return internal_->state().fired_direction();
-}
-
-webrtc::RTCError RTCRtpTransceiver::SetCodecPreferences(
- blink::WebVector<webrtc::RtpCodecCapability> codec_preferences) {
- return internal_->setCodecPreferences(codec_preferences.ReleaseVector());
-}
-} // namespace content