Files
platform-external-webrtc/pc/transceiver_list.cc
Henrik Boström 0a16276290 Restore FiredDirection and maybe fire OnTrack in Rollback.
Prior to this CL, rollback did not restore FiredDirection and remote
streams were only sometimes restored. This resulted in not firing
ontrack if a track was rolled back and then added again on the same
transceiver.

Rollback also never performed OnTrack, which is incorrect because a
transceiver that goes from sendrecv to inactive will cause OnRemoveTrack
and if this is rolled back (so we become sendrecv again) then we need
OnTrack to fire.

This CL improves rollback's "memory", fires ontrack in Rollback() and
adds test coverage.

Needed to solve similar bugs in the Chromium layers as well:
https://chromium-review.googlesource.com/c/chromium/src/+/3613313

Bug: chromium:1320669
Change-Id: I655dd7d8a6b86080fe0e7c32c9e8c6434062ae91
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/260330
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36734}
2022-05-02 18:07:24 +00:00

89 lines
2.3 KiB
C++

/*
* Copyright 2020 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.
*/
#include "pc/transceiver_list.h"
#include <string>
#include "rtc_base/checks.h"
namespace webrtc {
void TransceiverStableState::set_newly_created() {
RTC_DCHECK(!has_m_section_);
newly_created_ = true;
}
void TransceiverStableState::SetMSectionIfUnset(
absl::optional<std::string> mid,
absl::optional<size_t> mline_index) {
if (!has_m_section_) {
mid_ = mid;
mline_index_ = mline_index;
has_m_section_ = true;
}
}
void TransceiverStableState::SetRemoteStreamIds(
const std::vector<std::string>& ids) {
if (!remote_stream_ids_.has_value()) {
remote_stream_ids_ = ids;
}
}
void TransceiverStableState::SetInitSendEncodings(
const std::vector<RtpEncodingParameters>& encodings) {
init_send_encodings_ = encodings;
}
std::vector<RtpTransceiver*> TransceiverList::ListInternal() const {
RTC_DCHECK_RUN_ON(&sequence_checker_);
std::vector<RtpTransceiver*> internals;
for (auto transceiver : transceivers_) {
internals.push_back(transceiver->internal());
}
return internals;
}
RtpTransceiverProxyRefPtr TransceiverList::FindBySender(
rtc::scoped_refptr<RtpSenderInterface> sender) const {
RTC_DCHECK_RUN_ON(&sequence_checker_);
for (auto transceiver : transceivers_) {
if (transceiver->sender() == sender) {
return transceiver;
}
}
return nullptr;
}
RtpTransceiverProxyRefPtr TransceiverList::FindByMid(
const std::string& mid) const {
RTC_DCHECK_RUN_ON(&sequence_checker_);
for (auto transceiver : transceivers_) {
if (transceiver->mid() == mid) {
return transceiver;
}
}
return nullptr;
}
RtpTransceiverProxyRefPtr TransceiverList::FindByMLineIndex(
size_t mline_index) const {
RTC_DCHECK_RUN_ON(&sequence_checker_);
for (auto transceiver : transceivers_) {
if (transceiver->internal()->mline_index() == mline_index) {
return transceiver;
}
}
return nullptr;
}
} // namespace webrtc