// Copyright 2017 The Chromium Authors // 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_SENDER_IMPL_H_ #define THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_RTP_SENDER_IMPL_H_ #include <memory> #include <string> #include <vector> #include "base/functional/callback.h" #include "base/task/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/allow_discouraged_type.h" #include "third_party/blink/renderer/platform/peerconnection/rtc_rtp_sender_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/peer_connection_interface.h" #include "third_party/webrtc/api/rtp_sender_interface.h" #include "third_party/webrtc/api/scoped_refptr.h" namespace blink { class RTCEncodedAudioStreamTransformer; class RTCEncodedVideoStreamTransformer; // This class represents the state of a sender; a snapshot of what a // webrtc-layer sender 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 sender // 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 RtpSenderState is a snapshot of what the webrtc::RtpSenderInterface // looked like when the RtpSenderState 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 sender. // // Except for initialization logic and operator=(), the RtpSenderState is // immutable and only accessible on the main thread. // // TODO(crbug.com/787254): Consider merging RTCRtpSenderImpl and RTCRtpReceiver, // and removing RTCRtpSenderPlatform when all its clients are Onion soup'ed. // Also, move away from using std::vector. class MODULES_EXPORT RtpSenderState { … }; // Used to surface |webrtc::RtpSenderInterface| to blink. Multiple // |RTCRtpSenderImpl|s could reference the same webrtc sender; |id| is the value // of the pointer to the webrtc sender. // TODO(hbos): [Onion Soup] Move all of the implementation inside the blink // object and remove this class and interface. The blink object is reference // counted and we can get rid of this "Web"-copyable with "internal" nonsense, // all the blink object will need is the RtpSenderState. Requires coordination // with transceivers and receivers since these are tightly coupled. // https://crbug.com/787254 class MODULES_EXPORT RTCRtpSenderImpl : public blink::RTCRtpSenderPlatform { … }; } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_MODULES_PEERCONNECTION_RTC_RTP_SENDER_IMPL_H_