Prior to this CL, calling RtpTransceiver::SetChannel() with null arguments would cause the receiver's track to end. This is wrong, because the channel can be nulled for other reasons than the transceiver being stopped/removed - such as when the transceiver is rolled back but still in use. Also, stopping a transceiver will end the track, so we should simply ensure to always stop the transceiver when that is needed. This CL makes sure that the transceiver is stopped or stopping in all appropriate places, allowing us to remove the ability to end the source for any other reason. A side-effect of this is that: - The track never ends prematurely, fixing https://crbug.com/1315611. - Removed transceivers are always stopped, fixing https://crbug.com/webrtc/14005. This CL fixes the issue of track being ended in the ontrack event when running https://jsfiddle.net/henbos/nxebusjm/. - We don't have WPT test coverage for this, so I'll add that separately. With SetSourceEnded() removed, some stopping/stop in response to rejecting locally SDP munged content had to be added in order not to regress the existing test coverage for this: *PeerConnectionInterfaceTest.RejectMediaContent/1 Bug: chromium:1315611, webrtc:14005. Change-Id: I21f30a1259e51324066dc84f72a72485b9e0fadc Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/260180 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Henrik Boström <hbos@webrtc.org> Cr-Commit-Position: refs/heads/main@{#36669}
102 lines
3.8 KiB
C++
102 lines
3.8 KiB
C++
/*
|
|
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
// This file contains classes that implement RtpReceiverInterface.
|
|
// An RtpReceiver associates a MediaStreamTrackInterface with an underlying
|
|
// transport (provided by cricket::VoiceChannel/cricket::VideoChannel)
|
|
|
|
#ifndef PC_RTP_RECEIVER_H_
|
|
#define PC_RTP_RECEIVER_H_
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "absl/types/optional.h"
|
|
#include "api/crypto/frame_decryptor_interface.h"
|
|
#include "api/dtls_transport_interface.h"
|
|
#include "api/media_stream_interface.h"
|
|
#include "api/media_types.h"
|
|
#include "api/rtp_parameters.h"
|
|
#include "api/rtp_receiver_interface.h"
|
|
#include "api/scoped_refptr.h"
|
|
#include "api/video/video_frame.h"
|
|
#include "api/video/video_sink_interface.h"
|
|
#include "api/video/video_source_interface.h"
|
|
#include "media/base/media_channel.h"
|
|
#include "media/base/video_broadcaster.h"
|
|
#include "pc/video_track_source.h"
|
|
#include "rtc_base/ref_counted_object.h"
|
|
#include "rtc_base/thread.h"
|
|
|
|
namespace webrtc {
|
|
|
|
// Internal class used by PeerConnection.
|
|
class RtpReceiverInternal : public RtpReceiverInterface {
|
|
public:
|
|
// Call on the signaling thread, to let the receiver know that the the
|
|
// embedded source object should enter a stopped/ended state and the track's
|
|
// state set to `kEnded`, a final state that cannot be reversed.
|
|
virtual void Stop() = 0;
|
|
|
|
// Sets the underlying MediaEngine channel associated with this RtpSender.
|
|
// A VoiceMediaChannel should be used for audio RtpSenders and
|
|
// a VideoMediaChannel should be used for video RtpSenders.
|
|
// NOTE:
|
|
// * SetMediaChannel(nullptr) must be called before the media channel is
|
|
// destroyed.
|
|
// * This method must be invoked on the worker thread.
|
|
virtual void SetMediaChannel(cricket::MediaChannel* media_channel) = 0;
|
|
|
|
// Configures the RtpReceiver with the underlying media channel, with the
|
|
// given SSRC as the stream identifier.
|
|
virtual void SetupMediaChannel(uint32_t ssrc) = 0;
|
|
|
|
// Configures the RtpReceiver with the underlying media channel to receive an
|
|
// unsignaled receive stream.
|
|
virtual void SetupUnsignaledMediaChannel() = 0;
|
|
|
|
virtual void set_transport(
|
|
rtc::scoped_refptr<DtlsTransportInterface> dtls_transport) = 0;
|
|
// This SSRC is used as an identifier for the receiver between the API layer
|
|
// and the WebRtcVideoEngine, WebRtcVoiceEngine layer.
|
|
virtual uint32_t ssrc() const = 0;
|
|
|
|
// Call this to notify the RtpReceiver when the first packet has been received
|
|
// on the corresponding channel.
|
|
virtual void NotifyFirstPacketReceived() = 0;
|
|
|
|
// Set the associated remote media streams for this receiver. The remote track
|
|
// will be removed from any streams that are no longer present and added to
|
|
// any new streams.
|
|
virtual void set_stream_ids(std::vector<std::string> stream_ids) = 0;
|
|
// TODO(https://crbug.com/webrtc/9480): Remove SetStreams() in favor of
|
|
// set_stream_ids() as soon as downstream projects are no longer dependent on
|
|
// stream objects.
|
|
virtual void SetStreams(
|
|
const std::vector<rtc::scoped_refptr<MediaStreamInterface>>& streams) = 0;
|
|
|
|
// Returns an ID that changes if the attached track changes, but
|
|
// otherwise remains constant. Used to generate IDs for stats.
|
|
// The special value zero means that no track is attached.
|
|
virtual int AttachmentId() const = 0;
|
|
|
|
protected:
|
|
static int GenerateUniqueId();
|
|
|
|
static std::vector<rtc::scoped_refptr<MediaStreamInterface>>
|
|
CreateStreamsFromIds(std::vector<std::string> stream_ids);
|
|
};
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // PC_RTP_RECEIVER_H_
|