Remove the VideoReceiveStream2::rtp() accessor.

Instead offer accessors for the specific config values from the struct
that are needed at different times. The remote_ssrc and rtx_ssrc
properties maybe accessed from any thread, other properties have
stricter requiremets.

Bug: webrtc:11993
Change-Id: I3ff8527b13452c773fae1b2574f1e3fd2583b481
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/261319
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36823}
This commit is contained in:
Tommi 2022-05-09 18:57:16 +00:00 committed by WebRTC LUCI CQ
parent 7a15ff3f14
commit 363e812f2d
3 changed files with 31 additions and 40 deletions

View File

@ -1160,15 +1160,14 @@ webrtc::VideoReceiveStream* Call::CreateVideoReceiveStream(
// thread.
receive_stream->RegisterWithTransport(&video_receiver_controller_);
const webrtc::VideoReceiveStream::Config::Rtp& rtp = receive_stream->rtp();
if (rtp.rtx_ssrc) {
if (receive_stream->rtx_ssrc()) {
// We record identical config for the rtx stream as for the main
// stream. Since the transport_send_cc negotiation is per payload
// type, we may get an incorrect value for the rtx stream, but
// that is unlikely to matter in practice.
RegisterReceiveStream(rtp.rtx_ssrc, receive_stream);
RegisterReceiveStream(receive_stream->rtx_ssrc(), receive_stream);
}
RegisterReceiveStream(rtp.remote_ssrc, receive_stream);
RegisterReceiveStream(receive_stream->remote_ssrc(), receive_stream);
video_receive_streams_.insert(receive_stream);
ConfigureSync(receive_stream->sync_group());
@ -1188,22 +1187,19 @@ void Call::DestroyVideoReceiveStream(
// TODO(bugs.webrtc.org/11993): Unregister on the network thread.
receive_stream_impl->UnregisterFromTransport();
// TODO(tommi): Remove `rtp()` accessor.
const webrtc::VideoReceiveStream::Config::Rtp& rtp =
receive_stream_impl->rtp();
// Remove all ssrcs pointing to a receive stream. As RTX retransmits on a
// separate SSRC there can be either one or two.
UnregisterReceiveStream(rtp.remote_ssrc);
if (rtp.rtx_ssrc) {
UnregisterReceiveStream(rtp.rtx_ssrc);
UnregisterReceiveStream(receive_stream_impl->remote_ssrc());
if (receive_stream_impl->rtx_ssrc()) {
UnregisterReceiveStream(receive_stream_impl->rtx_ssrc());
}
video_receive_streams_.erase(receive_stream_impl);
ConfigureSync(receive_stream_impl->sync_group());
receive_side_cc_
.GetRemoteBitrateEstimator(UseSendSideBwe(receive_stream_impl))
->RemoveStream(rtp.remote_ssrc);
->RemoveStream(receive_stream_impl->remote_ssrc());
UpdateAggregateNetworkState();
delete receive_stream_impl;

View File

@ -220,7 +220,7 @@ VideoReceiveStream2::VideoReceiveStream2(
clock_(clock),
call_stats_(call_stats),
source_tracker_(clock_),
stats_proxy_(config_.rtp.remote_ssrc,
stats_proxy_(remote_ssrc(),
clock_,
call->worker_thread(),
call->trials()),
@ -276,13 +276,12 @@ VideoReceiveStream2::VideoReceiveStream2(
&decode_queue_, this, max_wait_for_keyframe_, max_wait_for_frame_,
decode_sync_, call_->trials());
if (config_.rtp.rtx_ssrc) {
if (rtx_ssrc()) {
rtx_receive_stream_ = std::make_unique<RtxReceiveStream>(
&rtp_video_stream_receiver_, config_.rtp.rtx_associated_payload_types,
config_.rtp.remote_ssrc, rtp_receive_statistics_.get());
remote_ssrc(), rtp_receive_statistics_.get());
} else {
rtp_receive_statistics_->EnableRetransmitDetection(config_.rtp.remote_ssrc,
true);
rtp_receive_statistics_->EnableRetransmitDetection(remote_ssrc(), true);
}
ParseFieldTrial(
@ -308,11 +307,11 @@ void VideoReceiveStream2::RegisterWithTransport(
// Register with RtpStreamReceiverController.
media_receiver_ = receiver_controller->CreateReceiver(
config_.rtp.remote_ssrc, &rtp_video_stream_receiver_);
if (config_.rtp.rtx_ssrc) {
remote_ssrc(), &rtp_video_stream_receiver_);
if (rtx_ssrc()) {
RTC_DCHECK(rtx_receive_stream_);
rtx_receiver_ = receiver_controller->CreateReceiver(
config_.rtp.rtx_ssrc, rtx_receive_stream_.get());
rtx_ssrc(), rtx_receive_stream_.get());
}
}
@ -322,11 +321,6 @@ void VideoReceiveStream2::UnregisterFromTransport() {
rtx_receiver_.reset();
}
const VideoReceiveStream2::Config::Rtp& VideoReceiveStream2::rtp() const {
RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
return config_.rtp;
}
const std::string& VideoReceiveStream2::sync_group() const {
RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
return config_.sync_group;
@ -519,8 +513,8 @@ void VideoReceiveStream2::CreateAndRegisterExternalDecoder(
if (!decoded_output_file.empty()) {
char filename_buffer[256];
rtc::SimpleStringBuilder ssb(filename_buffer);
ssb << decoded_output_file << "/webrtc_receive_stream_"
<< config_.rtp.remote_ssrc << "-" << rtc::TimeMicros() << ".ivf";
ssb << decoded_output_file << "/webrtc_receive_stream_" << remote_ssrc()
<< "-" << rtc::TimeMicros() << ".ivf";
video_decoder = CreateFrameDumpingDecoderWrapper(
std::move(video_decoder), FileWrapper::OpenWriteOnly(ssb.str()));
}
@ -540,9 +534,9 @@ VideoReceiveStream::Stats VideoReceiveStream2::GetStats() const {
stats.rtp_stats = statistician->GetStats();
stats.total_bitrate_bps = statistician->BitrateReceived();
}
if (config_.rtp.rtx_ssrc) {
if (rtx_ssrc()) {
StreamStatistician* rtx_statistician =
rtp_receive_statistics_->GetStatistician(config_.rtp.rtx_ssrc);
rtp_receive_statistics_->GetStatistician(rtx_ssrc());
if (rtx_statistician)
stats.total_bitrate_bps += rtx_statistician->BitrateReceived();
}
@ -554,14 +548,14 @@ void VideoReceiveStream2::UpdateHistograms() {
absl::optional<int> fraction_lost;
StreamDataCounters rtp_stats;
StreamStatistician* statistician =
rtp_receive_statistics_->GetStatistician(config_.rtp.remote_ssrc);
rtp_receive_statistics_->GetStatistician(remote_ssrc());
if (statistician) {
fraction_lost = statistician->GetFractionLostInPercent();
rtp_stats = statistician->GetReceiveStreamDataCounters();
}
if (config_.rtp.rtx_ssrc) {
if (rtx_ssrc()) {
StreamStatistician* rtx_statistician =
rtp_receive_statistics_->GetStatistician(config_.rtp.rtx_ssrc);
rtp_receive_statistics_->GetStatistician(rtx_ssrc());
if (rtx_statistician) {
StreamDataCounters rtx_stats =
rtx_statistician->GetReceiveStreamDataCounters();
@ -707,7 +701,7 @@ void VideoReceiveStream2::OnRttUpdate(int64_t avg_rtt_ms, int64_t max_rtt_ms) {
uint32_t VideoReceiveStream2::id() const {
RTC_DCHECK_RUN_ON(&worker_sequence_checker_);
return config_.rtp.remote_ssrc;
return remote_ssrc();
}
absl::optional<Syncable::Info> VideoReceiveStream2::GetInfo() const {

View File

@ -117,14 +117,15 @@ class VideoReceiveStream2
// network thread.
void UnregisterFromTransport();
// Convenience getters for parts of the receive stream's config.
// The accessors must be called on the packet delivery thread in accordance
// to documentation for RtpConfig (see receive_stream.h), the returned
// values should not be cached and should just be used within the calling
// context as some values might change.
const Config::Rtp& rtp() const;
// Accessor for the a/v sync group. This value may change and the caller
// must be on the packet delivery thread.
const std::string& sync_group() const;
// Getters for const remote SSRC values that won't change throughout the
// object's lifetime.
uint32_t remote_ssrc() const { return config_.rtp.remote_ssrc; }
uint32_t rtx_ssrc() const { return config_.rtp.rtx_ssrc; }
void SignalNetworkState(NetworkState state);
bool DeliverRtcp(const uint8_t* packet, size_t length);
@ -136,7 +137,7 @@ class VideoReceiveStream2
void SetRtpExtensions(std::vector<RtpExtension> extensions) override;
const std::vector<RtpExtension>& GetRtpExtensions() const override;
bool transport_cc() const override { return rtp().transport_cc; }
bool transport_cc() const override { return config_.rtp.transport_cc; }
webrtc::VideoReceiveStream::Stats GetStats() const override;