blob: 5316a5100b1a794266f6151f891c4a69ea397a09 [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_RTC_RTP_RECEIVER_IMPL_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_RTP_RECEIVER_IMPL_H_
#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/webrtc_media_stream_track_adapter_map.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_rtp_receiver_platform.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_rtp_transceiver_platform.h"
#include "third_party/blink/renderer/platform/peerconnection/rtc_stats.h"
#include "third_party/webrtc/api/media_stream_interface.h"
#include "third_party/webrtc/api/peer_connection_interface.h"
#include "third_party/webrtc/api/rtp_receiver_interface.h"
#include "third_party/webrtc/api/stats/rtc_stats.h"
namespace blink {
class RTCEncodedAudioStreamTransformer;
class RTCEncodedVideoStreamTransformer;
// This class represents the state of a receiver; a snapshot of what a
// webrtc-layer receiver looked like when it was inspected on the signaling
// thread such that this information can be moved to the main thread in a single
// PostTask. It is used to surface state changes to make the blink-layer
// receiver up-to-date.
//
// Blink objects live on the main thread and webrtc objects live on the
// signaling thread. If multiple asynchronous operations begin execution on the
// main thread they are posted and executed in order on the signaling thread.
// For example, operation A and operation B are called in JavaScript. When A is
// done on the signaling thread, webrtc object states will be updated. A
// callback is posted to the main thread so that blink objects can be updated to
// match the result of operation A. But if callback A tries to inspect the
// webrtc objects from the main thread this requires posting back to the
// signaling thread and waiting, which also includes waiting for the previously
// posted task: operation B. Inspecting the webrtc object like this does not
// guarantee you to get the state of operation A.
//
// As such, all state changes associated with an operation have to be surfaced
// in the same callback. This includes copying any states into a separate object
// so that it can be inspected on the main thread without any additional thread
// hops.
//
// The RtpReceiverState is a snapshot of what the webrtc::RtpReceiverInterface
// looked like when the RtpReceiverState was created on the signaling thread. It
// also takes care of initializing track adapters, such that we have access to a
// blink track corresponding to the webrtc track of the receiver.
//
// Except for initialization logic and operator=(), the RtpReceiverState is
// immutable and only accessible on the main thread.
//
// TODO(crbug.com/787254): Consider merging RTCRtpReceiverImpl and
// RTCRtpReceiver, and removing RTCRtpReceiverPlatform when all its clients are
// Onion soup'ed. Also, move away from using std::vector.
class MODULES_EXPORT RtpReceiverState {
public:
RtpReceiverState(
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner,
scoped_refptr<webrtc::RtpReceiverInterface> webrtc_receiver,
std::unique_ptr<blink::WebRtcMediaStreamTrackAdapterMap::AdapterRef>
track_ref,
std::vector<std::string> stream_ids);
RtpReceiverState(RtpReceiverState&&);
RtpReceiverState(const RtpReceiverState&) = delete;
~RtpReceiverState();
// This is intended to be used for moving the object from the signaling thread
// to the main thread and as such has no thread checks. Once moved to the main
// this should only be invoked on the main thread.
RtpReceiverState& operator=(RtpReceiverState&&);
RtpReceiverState& operator=(const RtpReceiverState&) = delete;
bool is_initialized() const;
void Initialize();
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner() const;
scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner() const;
scoped_refptr<webrtc::RtpReceiverInterface> webrtc_receiver() const;
rtc::scoped_refptr<webrtc::DtlsTransportInterface> webrtc_dtls_transport()
const;
webrtc::DtlsTransportInformation webrtc_dtls_transport_information() const;
const std::unique_ptr<blink::WebRtcMediaStreamTrackAdapterMap::AdapterRef>&
track_ref() const;
const std::vector<std::string>& stream_ids() const;
private:
scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
scoped_refptr<base::SingleThreadTaskRunner> signaling_task_runner_;
scoped_refptr<webrtc::RtpReceiverInterface> webrtc_receiver_;
rtc::scoped_refptr<webrtc::DtlsTransportInterface> webrtc_dtls_transport_;
webrtc::DtlsTransportInformation webrtc_dtls_transport_information_;
bool is_initialized_;
std::unique_ptr<blink::WebRtcMediaStreamTrackAdapterMap::AdapterRef>
track_ref_;
std::vector<std::string> stream_ids_;
};
// Used to surface |webrtc::RtpReceiverInterface| to blink. Multiple
// |RTCRtpReceiverImpl|s could reference the same webrtc receiver; |id| is the
// value of the pointer to the webrtc receiver.
class MODULES_EXPORT RTCRtpReceiverImpl : public RTCRtpReceiverPlatform {
public:
static uintptr_t getId(
const webrtc::RtpReceiverInterface* webrtc_rtp_receiver);
RTCRtpReceiverImpl(
scoped_refptr<webrtc::PeerConnectionInterface> native_peer_connection,
RtpReceiverState state,
bool force_encoded_audio_insertable_streams,
bool force_encoded_video_insertable_streams);
RTCRtpReceiverImpl(const RTCRtpReceiverImpl& other);
~RTCRtpReceiverImpl() override;
RTCRtpReceiverImpl& operator=(const RTCRtpReceiverImpl& other);
const RtpReceiverState& state() const;
void set_state(RtpReceiverState state);
std::unique_ptr<RTCRtpReceiverPlatform> ShallowCopy() const override;
uintptr_t Id() const override;
rtc::scoped_refptr<webrtc::DtlsTransportInterface> DtlsTransport() override;
webrtc::DtlsTransportInformation DtlsTransportInformation() override;
MediaStreamComponent* Track() const override;
Vector<String> StreamIds() const override;
Vector<std::unique_ptr<RTCRtpSource>> GetSources() override;
void GetStats(RTCStatsReportCallback,
const Vector<webrtc::NonStandardGroupId>&) override;
std::unique_ptr<webrtc::RtpParameters> GetParameters() const override;
void SetJitterBufferMinimumDelay(
base::Optional<double> delay_seconds) override;
RTCEncodedAudioStreamTransformer* GetEncodedAudioStreamTransformer()
const override;
RTCEncodedVideoStreamTransformer* GetEncodedVideoStreamTransformer()
const override;
private:
class RTCRtpReceiverInternal;
struct RTCRtpReceiverInternalTraits;
scoped_refptr<RTCRtpReceiverInternal> internal_;
};
class MODULES_EXPORT RTCRtpReceiverOnlyTransceiver
: public RTCRtpPlanBTransceiverPlatform {
public:
RTCRtpReceiverOnlyTransceiver(
std::unique_ptr<RTCRtpReceiverPlatform> receiver);
~RTCRtpReceiverOnlyTransceiver() override;
RTCRtpTransceiverPlatformImplementationType ImplementationType()
const override;
uintptr_t Id() const override;
String Mid() const override;
std::unique_ptr<blink::RTCRtpSenderPlatform> Sender() const override;
std::unique_ptr<RTCRtpReceiverPlatform> Receiver() const override;
bool Stopped() const override;
webrtc::RtpTransceiverDirection Direction() const override;
webrtc::RTCError SetDirection(
webrtc::RtpTransceiverDirection direction) override;
base::Optional<webrtc::RtpTransceiverDirection> CurrentDirection()
const override;
base::Optional<webrtc::RtpTransceiverDirection> FiredDirection()
const override;
webrtc::RTCError SetCodecPreferences(
Vector<webrtc::RtpCodecCapability>) override;
private:
std::unique_ptr<RTCRtpReceiverPlatform> receiver_;
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_RTP_RECEIVER_IMPL_H_