mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-12 21:30:45 +01:00
Reland "Remove 'trackId' dependency in stats selector algorithm."
This is a reland of commit 81aab48878
See diff between Patch Set 1 and latest Patch Set.
The original CL broke this WPT[1] because getStats() with the receiver
as the selector stopped working in the event of unsignalled SSRCs due
to the receiver not knowing what the SSRC was.
This fix is to query media_channel_ for the unsignalled SSRC in the
event that the receiver does not know the SSRC.
[1] https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/web_tests/external/wpt/webrtc/simulcast/setParameters-active.https.html
Original change's description:
> Remove 'trackId' dependency in stats selector algorithm.
>
> In preparation for the deletion of deprecated 'track' stats, the
> stats selector algorithm needs to be rewritten not to use 'trackId'.
>
> This is achieved by finding RTP stats by their SSRC, as obtained via
> getParameters(). This unfortunately adds a block-invoke (in the sender
> case the block-invoke happens inside GetParametersInternal and in the
> receiver case the block-invoke is explicit at the calling place), but
> it can't be helped and it's just once per getStats() call and only if
> the selector argument is used.
>
> Bug: webrtc:14175
> Change-Id: If0e14cdbdc76d141e0042e43757970893bf32119
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/289101
> Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> Commit-Queue: Henrik Boström <hbos@webrtc.org>
> Cr-Commit-Position: refs/heads/main@{#38981}
Bug: webrtc:14175, webrtc:14811
Change-Id: I0d16724af4efeb93d50e36dbfcc798564daff5c0
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/290600
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39010}
This commit is contained in:
parent
d152a6d51c
commit
175f06f112
18 changed files with 98 additions and 62 deletions
|
@ -121,6 +121,9 @@ class RtpHelper : public Base {
|
|||
return RemoveStreamBySsrc(&send_streams_, ssrc);
|
||||
}
|
||||
virtual void ResetUnsignaledRecvStream() {}
|
||||
virtual absl::optional<uint32_t> GetUnsignaledSsrc() const {
|
||||
return absl::nullopt;
|
||||
}
|
||||
virtual void OnDemuxerCriteriaUpdatePending() {}
|
||||
virtual void OnDemuxerCriteriaUpdateComplete() {}
|
||||
|
||||
|
|
|
@ -282,6 +282,8 @@ class MediaReceiveChannelInterface
|
|||
// Resets any cached StreamParams for an unsignaled RecvStream, and removes
|
||||
// any existing unsignaled streams.
|
||||
virtual void ResetUnsignaledRecvStream() = 0;
|
||||
// Gets the current unsignaled receive stream's SSRC, if there is one.
|
||||
virtual absl::optional<uint32_t> GetUnsignaledSsrc() const = 0;
|
||||
// This is currently a workaround because of the demuxer state being managed
|
||||
// across two separate threads. Once the state is consistently managed on
|
||||
// the same thread (network), this workaround can be removed.
|
||||
|
|
|
@ -420,6 +420,9 @@ class VoiceMediaReceiveChannel : public VoiceMediaReceiveChannelInterface {
|
|||
void ResetUnsignaledRecvStream() override {
|
||||
return impl()->ResetUnsignaledRecvStream();
|
||||
}
|
||||
absl::optional<uint32_t> GetUnsignaledSsrc() const override {
|
||||
return impl()->GetUnsignaledSsrc();
|
||||
}
|
||||
void OnDemuxerCriteriaUpdatePending() override {
|
||||
impl()->OnDemuxerCriteriaUpdatePending();
|
||||
}
|
||||
|
@ -614,6 +617,9 @@ class VideoMediaReceiveChannel : public VideoMediaReceiveChannelInterface {
|
|||
void ResetUnsignaledRecvStream() override {
|
||||
return impl()->ResetUnsignaledRecvStream();
|
||||
}
|
||||
absl::optional<uint32_t> GetUnsignaledSsrc() const override {
|
||||
return impl()->GetUnsignaledSsrc();
|
||||
}
|
||||
void OnDemuxerCriteriaUpdatePending() override {
|
||||
impl()->OnDemuxerCriteriaUpdatePending();
|
||||
}
|
||||
|
|
|
@ -548,8 +548,7 @@ UnsignalledSsrcHandler::Action DefaultUnsignalledSsrcHandler::OnUnsignalledSsrc(
|
|||
WebRtcVideoChannel* channel,
|
||||
uint32_t ssrc,
|
||||
absl::optional<uint32_t> rtx_ssrc) {
|
||||
absl::optional<uint32_t> default_recv_ssrc =
|
||||
channel->GetDefaultReceiveStreamSsrc();
|
||||
absl::optional<uint32_t> default_recv_ssrc = channel->GetUnsignaledSsrc();
|
||||
|
||||
if (default_recv_ssrc) {
|
||||
RTC_LOG(LS_INFO) << "Destroying old default receive stream for SSRC="
|
||||
|
@ -588,8 +587,7 @@ void DefaultUnsignalledSsrcHandler::SetDefaultSink(
|
|||
WebRtcVideoChannel* channel,
|
||||
rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) {
|
||||
default_sink_ = sink;
|
||||
absl::optional<uint32_t> default_recv_ssrc =
|
||||
channel->GetDefaultReceiveStreamSsrc();
|
||||
absl::optional<uint32_t> default_recv_ssrc = channel->GetUnsignaledSsrc();
|
||||
if (default_recv_ssrc) {
|
||||
channel->SetSink(*default_recv_ssrc, default_sink_);
|
||||
}
|
||||
|
@ -1566,6 +1564,18 @@ void WebRtcVideoChannel::ResetUnsignaledRecvStream() {
|
|||
}
|
||||
}
|
||||
|
||||
absl::optional<uint32_t> WebRtcVideoChannel::GetUnsignaledSsrc() const {
|
||||
RTC_DCHECK_RUN_ON(&thread_checker_);
|
||||
absl::optional<uint32_t> ssrc;
|
||||
for (auto it = receive_streams_.begin(); it != receive_streams_.end(); ++it) {
|
||||
if (it->second->IsDefaultStream()) {
|
||||
ssrc.emplace(it->first);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ssrc;
|
||||
}
|
||||
|
||||
void WebRtcVideoChannel::OnDemuxerCriteriaUpdatePending() {
|
||||
RTC_DCHECK_RUN_ON(&thread_checker_);
|
||||
++demuxer_criteria_id_;
|
||||
|
@ -1756,7 +1766,7 @@ void WebRtcVideoChannel::OnPacketReceived(rtc::CopyOnWriteBuffer packet,
|
|||
// stream, which will be associated with unsignaled media stream.
|
||||
// It is not possible to update the ssrcs of a receive stream, so we
|
||||
// recreate it insead if found.
|
||||
auto default_ssrc = GetDefaultReceiveStreamSsrc();
|
||||
auto default_ssrc = GetUnsignaledSsrc();
|
||||
if (!default_ssrc) {
|
||||
return;
|
||||
}
|
||||
|
@ -1919,7 +1929,7 @@ void WebRtcVideoChannel::SetVideoCodecSwitchingEnabled(bool enabled) {
|
|||
bool WebRtcVideoChannel::SetBaseMinimumPlayoutDelayMs(uint32_t ssrc,
|
||||
int delay_ms) {
|
||||
RTC_DCHECK_RUN_ON(&thread_checker_);
|
||||
absl::optional<uint32_t> default_ssrc = GetDefaultReceiveStreamSsrc();
|
||||
absl::optional<uint32_t> default_ssrc = GetUnsignaledSsrc();
|
||||
|
||||
// SSRC of 0 represents the default receive stream.
|
||||
if (ssrc == 0) {
|
||||
|
@ -1961,18 +1971,6 @@ absl::optional<int> WebRtcVideoChannel::GetBaseMinimumPlayoutDelayMs(
|
|||
}
|
||||
}
|
||||
|
||||
absl::optional<uint32_t> WebRtcVideoChannel::GetDefaultReceiveStreamSsrc() {
|
||||
RTC_DCHECK_RUN_ON(&thread_checker_);
|
||||
absl::optional<uint32_t> ssrc;
|
||||
for (auto it = receive_streams_.begin(); it != receive_streams_.end(); ++it) {
|
||||
if (it->second->IsDefaultStream()) {
|
||||
ssrc.emplace(it->first);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return ssrc;
|
||||
}
|
||||
|
||||
std::vector<webrtc::RtpSource> WebRtcVideoChannel::GetSources(
|
||||
uint32_t ssrc) const {
|
||||
RTC_DCHECK_RUN_ON(&thread_checker_);
|
||||
|
@ -3496,7 +3494,7 @@ WebRtcVideoChannel::MapCodecs(const std::vector<VideoCodec>& codecs) {
|
|||
WebRtcVideoChannel::WebRtcVideoReceiveStream*
|
||||
WebRtcVideoChannel::FindReceiveStream(uint32_t ssrc) {
|
||||
if (ssrc == 0) {
|
||||
absl::optional<uint32_t> default_ssrc = GetDefaultReceiveStreamSsrc();
|
||||
absl::optional<uint32_t> default_ssrc = GetUnsignaledSsrc();
|
||||
if (!default_ssrc) {
|
||||
return nullptr;
|
||||
}
|
||||
|
|
|
@ -165,6 +165,7 @@ class WebRtcVideoChannel : public VideoMediaChannel,
|
|||
bool AddRecvStream(const StreamParams& sp, bool default_stream);
|
||||
bool RemoveRecvStream(uint32_t ssrc) override;
|
||||
void ResetUnsignaledRecvStream() override;
|
||||
absl::optional<uint32_t> GetUnsignaledSsrc() const override;
|
||||
void OnDemuxerCriteriaUpdatePending() override;
|
||||
void OnDemuxerCriteriaUpdateComplete() override;
|
||||
bool SetSink(uint32_t ssrc,
|
||||
|
@ -216,8 +217,6 @@ class WebRtcVideoChannel : public VideoMediaChannel,
|
|||
return sending_;
|
||||
}
|
||||
|
||||
absl::optional<uint32_t> GetDefaultReceiveStreamSsrc();
|
||||
|
||||
StreamParams unsignaled_stream_params() {
|
||||
RTC_DCHECK_RUN_ON(&thread_checker_);
|
||||
return unsignaled_stream_params_;
|
||||
|
|
|
@ -1966,6 +1966,15 @@ void WebRtcVoiceMediaChannel::ResetUnsignaledRecvStream() {
|
|||
}
|
||||
}
|
||||
|
||||
absl::optional<uint32_t> WebRtcVoiceMediaChannel::GetUnsignaledSsrc() const {
|
||||
if (unsignaled_recv_ssrcs_.empty()) {
|
||||
return absl::nullopt;
|
||||
}
|
||||
// In the event of multiple unsignaled ssrcs, the last in the vector will be
|
||||
// the most recent one (the one forwarded to the MediaStreamTrack).
|
||||
return unsignaled_recv_ssrcs_.back();
|
||||
}
|
||||
|
||||
// Not implemented.
|
||||
// TODO(https://crbug.com/webrtc/12676): Implement a fix for the unsignalled
|
||||
// SSRC race that can happen when an m= section goes from receiving to not
|
||||
|
|
|
@ -173,6 +173,7 @@ class WebRtcVoiceMediaChannel final : public VoiceMediaChannel,
|
|||
bool AddRecvStream(const StreamParams& sp) override;
|
||||
bool RemoveRecvStream(uint32_t ssrc) override;
|
||||
void ResetUnsignaledRecvStream() override;
|
||||
absl::optional<uint32_t> GetUnsignaledSsrc() const override;
|
||||
void OnDemuxerCriteriaUpdatePending() override;
|
||||
void OnDemuxerCriteriaUpdateComplete() override;
|
||||
|
||||
|
|
|
@ -212,9 +212,12 @@ void AudioRtpReceiver::SetupUnsignaledMediaChannel() {
|
|||
RestartMediaChannel(absl::nullopt);
|
||||
}
|
||||
|
||||
uint32_t AudioRtpReceiver::ssrc() const {
|
||||
absl::optional<uint32_t> AudioRtpReceiver::ssrc() const {
|
||||
RTC_DCHECK_RUN_ON(worker_thread_);
|
||||
return ssrc_.value_or(0);
|
||||
if (!ssrc_.has_value() && media_channel_) {
|
||||
return media_channel_->GetUnsignaledSsrc();
|
||||
}
|
||||
return ssrc_;
|
||||
}
|
||||
|
||||
void AudioRtpReceiver::set_stream_ids(std::vector<std::string> stream_ids) {
|
||||
|
|
|
@ -100,7 +100,7 @@ class AudioRtpReceiver : public ObserverInterface,
|
|||
void Stop() override;
|
||||
void SetupMediaChannel(uint32_t ssrc) override;
|
||||
void SetupUnsignaledMediaChannel() override;
|
||||
uint32_t ssrc() const override;
|
||||
absl::optional<uint32_t> ssrc() const override;
|
||||
void NotifyFirstPacketReceived() override;
|
||||
void set_stream_ids(std::vector<std::string> stream_ids) override;
|
||||
void set_transport(
|
||||
|
|
|
@ -1231,7 +1231,7 @@ void LegacyStatsCollector::ExtractMediaInfo(
|
|||
|
||||
for (const auto& receiver : transceiver->internal()->receivers()) {
|
||||
gatherer->receiver_track_id_by_ssrc.insert(std::make_pair(
|
||||
receiver->internal()->ssrc(), receiver->track()->id()));
|
||||
receiver->internal()->ssrc().value_or(0), receiver->track()->id()));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1249,7 +1249,10 @@ void ProduceReceiverMediaTrackStats(
|
|||
}
|
||||
}
|
||||
|
||||
rtc::scoped_refptr<RTCStatsReport> CreateReportFilteredBySelector(
|
||||
} // namespace
|
||||
|
||||
rtc::scoped_refptr<RTCStatsReport>
|
||||
RTCStatsCollector::CreateReportFilteredBySelector(
|
||||
bool filter_by_sender_selector,
|
||||
rtc::scoped_refptr<const RTCStatsReport> report,
|
||||
rtc::scoped_refptr<RtpSenderInternal> sender_selector,
|
||||
|
@ -1258,40 +1261,35 @@ rtc::scoped_refptr<RTCStatsReport> CreateReportFilteredBySelector(
|
|||
if (filter_by_sender_selector) {
|
||||
// Filter mode: RTCStatsCollector::RequestInfo::kSenderSelector
|
||||
if (sender_selector) {
|
||||
// Find outbound-rtp(s) of the sender, i.e. the outbound-rtp(s) that
|
||||
// reference the sender stats.
|
||||
// Because we do not implement sender stats, we look at outbound-rtp(s)
|
||||
// that reference the track attachment stats for the sender instead.
|
||||
std::string track_id =
|
||||
DEPRECATED_RTCMediaStreamTrackStatsIDFromDirectionAndAttachment(
|
||||
kDirectionOutbound, sender_selector->AttachmentId());
|
||||
for (const auto& stats : *report) {
|
||||
if (stats.type() != RTCOutboundRTPStreamStats::kType)
|
||||
continue;
|
||||
const auto& outbound_rtp = stats.cast_to<RTCOutboundRTPStreamStats>();
|
||||
if (outbound_rtp.track_id.is_defined() &&
|
||||
*outbound_rtp.track_id == track_id) {
|
||||
rtpstream_ids.push_back(outbound_rtp.id());
|
||||
// Find outbound-rtp(s) of the sender using ssrc lookup.
|
||||
auto encodings = sender_selector->GetParametersInternal().encodings;
|
||||
for (const auto* outbound_rtp :
|
||||
report->GetStatsOfType<RTCOutboundRTPStreamStats>()) {
|
||||
RTC_DCHECK(outbound_rtp->ssrc.is_defined());
|
||||
auto it = std::find_if(
|
||||
encodings.begin(), encodings.end(),
|
||||
[ssrc =
|
||||
*outbound_rtp->ssrc](const RtpEncodingParameters& encoding) {
|
||||
return encoding.ssrc.has_value() && encoding.ssrc.value() == ssrc;
|
||||
});
|
||||
if (it != encodings.end()) {
|
||||
rtpstream_ids.push_back(outbound_rtp->id());
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Filter mode: RTCStatsCollector::RequestInfo::kReceiverSelector
|
||||
if (receiver_selector) {
|
||||
// Find inbound-rtp(s) of the receiver, i.e. the inbound-rtp(s) that
|
||||
// reference the receiver stats.
|
||||
// Because we do not implement receiver stats, we look at inbound-rtp(s)
|
||||
// that reference the track attachment stats for the receiver instead.
|
||||
std::string track_id =
|
||||
DEPRECATED_RTCMediaStreamTrackStatsIDFromDirectionAndAttachment(
|
||||
kDirectionInbound, receiver_selector->AttachmentId());
|
||||
for (const auto& stats : *report) {
|
||||
if (stats.type() != RTCInboundRTPStreamStats::kType)
|
||||
continue;
|
||||
const auto& inbound_rtp = stats.cast_to<RTCInboundRTPStreamStats>();
|
||||
if (inbound_rtp.track_id.is_defined() &&
|
||||
*inbound_rtp.track_id == track_id) {
|
||||
rtpstream_ids.push_back(inbound_rtp.id());
|
||||
// Find the inbound-rtp of the receiver using ssrc lookup.
|
||||
absl::optional<uint32_t> ssrc;
|
||||
worker_thread_->BlockingCall([&] { ssrc = receiver_selector->ssrc(); });
|
||||
if (ssrc.has_value()) {
|
||||
for (const auto* inbound_rtp :
|
||||
report->GetStatsOfType<RTCInboundRTPStreamStats>()) {
|
||||
RTC_DCHECK(inbound_rtp->ssrc.is_defined());
|
||||
if (*inbound_rtp->ssrc == *ssrc) {
|
||||
rtpstream_ids.push_back(inbound_rtp->id());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1301,8 +1299,6 @@ rtc::scoped_refptr<RTCStatsReport> CreateReportFilteredBySelector(
|
|||
return TakeReferencedStats(report->Copy(), rtpstream_ids);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
RTCStatsCollector::CertificateStatsPair
|
||||
RTCStatsCollector::CertificateStatsPair::Copy() const {
|
||||
CertificateStatsPair copy;
|
||||
|
|
|
@ -244,6 +244,12 @@ class RTCStatsCollector : public rtc::RefCountInterface,
|
|||
// This is a NO-OP if `network_report_` is null.
|
||||
void MergeNetworkReport_s();
|
||||
|
||||
rtc::scoped_refptr<RTCStatsReport> CreateReportFilteredBySelector(
|
||||
bool filter_by_sender_selector,
|
||||
rtc::scoped_refptr<const RTCStatsReport> report,
|
||||
rtc::scoped_refptr<RtpSenderInternal> sender_selector,
|
||||
rtc::scoped_refptr<RtpReceiverInternal> receiver_selector);
|
||||
|
||||
// Slots for signals (sigslot) that are wired up to `pc_`.
|
||||
void OnSctpDataChannelCreated(SctpDataChannel* channel);
|
||||
// Slots for signals (sigslot) that are wired up to `channel`.
|
||||
|
|
|
@ -388,7 +388,10 @@ rtc::scoped_refptr<MockRtpSenderInternal> CreateMockSender(
|
|||
EXPECT_CALL(*sender, track()).WillRepeatedly(Return(track));
|
||||
EXPECT_CALL(*sender, ssrc()).WillRepeatedly(Return(ssrc));
|
||||
EXPECT_CALL(*sender, media_type()).WillRepeatedly(Return(media_type));
|
||||
EXPECT_CALL(*sender, GetParameters()).WillRepeatedly(Invoke([ssrc]() {
|
||||
EXPECT_CALL(*sender, GetParameters())
|
||||
.WillRepeatedly(
|
||||
Invoke([s = sender.get()]() { return s->GetParametersInternal(); }));
|
||||
EXPECT_CALL(*sender, GetParametersInternal()).WillRepeatedly(Invoke([ssrc]() {
|
||||
RtpParameters params;
|
||||
params.encodings.push_back(RtpEncodingParameters());
|
||||
params.encodings[0].ssrc = ssrc;
|
||||
|
@ -406,6 +409,9 @@ rtc::scoped_refptr<MockRtpReceiverInternal> CreateMockReceiver(
|
|||
int attachment_id) {
|
||||
auto receiver = rtc::make_ref_counted<MockRtpReceiverInternal>();
|
||||
EXPECT_CALL(*receiver, track()).WillRepeatedly(Return(track));
|
||||
EXPECT_CALL(*receiver, ssrc()).WillRepeatedly(Invoke([ssrc]() {
|
||||
return ssrc;
|
||||
}));
|
||||
EXPECT_CALL(*receiver, streams())
|
||||
.WillRepeatedly(
|
||||
Return(std::vector<rtc::scoped_refptr<MediaStreamInterface>>({})));
|
||||
|
|
|
@ -68,7 +68,7 @@ class RtpReceiverInternal : public RtpReceiverInterface {
|
|||
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;
|
||||
virtual absl::optional<uint32_t> ssrc() const = 0;
|
||||
|
||||
// Call this to notify the RtpReceiver when the first packet has been received
|
||||
// on the corresponding channel.
|
||||
|
|
|
@ -63,7 +63,7 @@ class MockRtpReceiverInternal : public RtpReceiverInternal {
|
|||
(override));
|
||||
MOCK_METHOD(void, SetupMediaChannel, (uint32_t), (override));
|
||||
MOCK_METHOD(void, SetupUnsignaledMediaChannel, (), (override));
|
||||
MOCK_METHOD(uint32_t, ssrc, (), (const, override));
|
||||
MOCK_METHOD(absl::optional<uint32_t>, ssrc, (), (const, override));
|
||||
MOCK_METHOD(void, NotifyFirstPacketReceived, (), (override));
|
||||
MOCK_METHOD(void, set_stream_ids, (std::vector<std::string>), (override));
|
||||
MOCK_METHOD(void,
|
||||
|
|
|
@ -53,6 +53,10 @@ class MockVoiceMediaChannel : public VoiceMediaChannel {
|
|||
MOCK_METHOD(bool, AddRecvStream, (const StreamParams& sp), (override));
|
||||
MOCK_METHOD(bool, RemoveRecvStream, (uint32_t ssrc), (override));
|
||||
MOCK_METHOD(void, ResetUnsignaledRecvStream, (), (override));
|
||||
MOCK_METHOD(absl::optional<uint32_t>,
|
||||
GetUnsignaledSsrc,
|
||||
(),
|
||||
(const, override));
|
||||
MOCK_METHOD(void, OnDemuxerCriteriaUpdatePending, (), (override));
|
||||
MOCK_METHOD(void, OnDemuxerCriteriaUpdateComplete, (), (override));
|
||||
MOCK_METHOD(int, GetRtpSendTimeExtnId, (), (const, override));
|
||||
|
|
|
@ -184,9 +184,12 @@ void VideoRtpReceiver::SetupUnsignaledMediaChannel() {
|
|||
RestartMediaChannel(absl::nullopt);
|
||||
}
|
||||
|
||||
uint32_t VideoRtpReceiver::ssrc() const {
|
||||
absl::optional<uint32_t> VideoRtpReceiver::ssrc() const {
|
||||
RTC_DCHECK_RUN_ON(worker_thread_);
|
||||
return ssrc_.value_or(0);
|
||||
if (!ssrc_.has_value() && media_channel_) {
|
||||
return media_channel_->GetUnsignaledSsrc();
|
||||
}
|
||||
return ssrc_;
|
||||
}
|
||||
|
||||
void VideoRtpReceiver::set_stream_ids(std::vector<std::string> stream_ids) {
|
||||
|
|
|
@ -89,7 +89,7 @@ class VideoRtpReceiver : public RtpReceiverInternal {
|
|||
void Stop() override;
|
||||
void SetupMediaChannel(uint32_t ssrc) override;
|
||||
void SetupUnsignaledMediaChannel() override;
|
||||
uint32_t ssrc() const override;
|
||||
absl::optional<uint32_t> ssrc() const override;
|
||||
void NotifyFirstPacketReceived() override;
|
||||
void set_stream_ids(std::vector<std::string> stream_ids) override;
|
||||
void set_transport(
|
||||
|
|
Loading…
Reference in a new issue