Add plumbing for video NACK to be coupled between channels.
Bug: webrtc:13931, webrtc:14920 Change-Id: I451869e295e099a1d08c0c80e481decd53149f1b Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/294382 Reviewed-by: Henrik Boström <hbos@webrtc.org> Commit-Queue: Harald Alvestrand <hta@webrtc.org> Cr-Commit-Position: refs/heads/main@{#39373}
This commit is contained in:
parent
14e2779a6c
commit
a087f6f1c8
@ -513,6 +513,18 @@ class FakeVideoMediaChannel : public RtpHelper<VideoMediaChannel> {
|
|||||||
void RequestRecvKeyFrame(uint32_t ssrc) override;
|
void RequestRecvKeyFrame(uint32_t ssrc) override;
|
||||||
void GenerateSendKeyFrame(uint32_t ssrc,
|
void GenerateSendKeyFrame(uint32_t ssrc,
|
||||||
const std::vector<std::string>& rids) override;
|
const std::vector<std::string>& rids) override;
|
||||||
|
webrtc::RtcpMode SendCodecRtcpMode() const override {
|
||||||
|
return webrtc::RtcpMode::kCompound;
|
||||||
|
}
|
||||||
|
bool SendCodecHasLntf() const override { return false; }
|
||||||
|
bool SendCodecHasNack() const override { return false; }
|
||||||
|
absl::optional<int> SendCodecRtxTime() const override {
|
||||||
|
return absl::nullopt;
|
||||||
|
}
|
||||||
|
void SetReceiverFeedbackParameters(bool lntf_enabled,
|
||||||
|
bool nack_enabled,
|
||||||
|
webrtc::RtcpMode rtcp_mode,
|
||||||
|
absl::optional<int> rtx_time) override {}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool SetRecvCodecs(const std::vector<VideoCodec>& codecs);
|
bool SetRecvCodecs(const std::vector<VideoCodec>& codecs);
|
||||||
|
|||||||
@ -959,6 +959,11 @@ class VideoMediaSendChannelInterface : public MediaSendChannelInterface {
|
|||||||
virtual void SetVideoCodecSwitchingEnabled(bool enabled) = 0;
|
virtual void SetVideoCodecSwitchingEnabled(bool enabled) = 0;
|
||||||
virtual bool GetStats(VideoMediaSendInfo* stats) = 0;
|
virtual bool GetStats(VideoMediaSendInfo* stats) = 0;
|
||||||
virtual void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) = 0;
|
virtual void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) = 0;
|
||||||
|
// Information queries to support SetReceiverFeedbackParameters
|
||||||
|
virtual webrtc::RtcpMode SendCodecRtcpMode() const = 0;
|
||||||
|
virtual bool SendCodecHasLntf() const = 0;
|
||||||
|
virtual bool SendCodecHasNack() const = 0;
|
||||||
|
virtual absl::optional<int> SendCodecRtxTime() const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class VideoMediaReceiveChannelInterface : public MediaReceiveChannelInterface {
|
class VideoMediaReceiveChannelInterface : public MediaReceiveChannelInterface {
|
||||||
@ -988,6 +993,10 @@ class VideoMediaReceiveChannelInterface : public MediaReceiveChannelInterface {
|
|||||||
// Clear recordable encoded frame callback for `ssrc`
|
// Clear recordable encoded frame callback for `ssrc`
|
||||||
virtual void ClearRecordableEncodedFrameCallback(uint32_t ssrc) = 0;
|
virtual void ClearRecordableEncodedFrameCallback(uint32_t ssrc) = 0;
|
||||||
virtual bool GetStats(VideoMediaReceiveInfo* stats) = 0;
|
virtual bool GetStats(VideoMediaReceiveInfo* stats) = 0;
|
||||||
|
virtual void SetReceiverFeedbackParameters(bool lntf_enabled,
|
||||||
|
bool nack_enabled,
|
||||||
|
webrtc::RtcpMode rtcp_mode,
|
||||||
|
absl::optional<int> rtx_time) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Info about data received in DataMediaChannel. For use in
|
// Info about data received in DataMediaChannel. For use in
|
||||||
|
|||||||
@ -652,6 +652,15 @@ class VideoMediaSendChannel : public VideoMediaSendChannelInterface {
|
|||||||
void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) override {
|
void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) override {
|
||||||
return impl_->FillBitrateInfo(bwe_info);
|
return impl_->FillBitrateInfo(bwe_info);
|
||||||
}
|
}
|
||||||
|
// Information queries to support SetReceiverFeedbackParameters
|
||||||
|
webrtc::RtcpMode SendCodecRtcpMode() const override {
|
||||||
|
return impl()->SendCodecRtcpMode();
|
||||||
|
}
|
||||||
|
bool SendCodecHasLntf() const override { return impl()->SendCodecHasLntf(); }
|
||||||
|
bool SendCodecHasNack() const override { return impl()->SendCodecHasNack(); }
|
||||||
|
absl::optional<int> SendCodecRtxTime() const override {
|
||||||
|
return impl()->SendCodecRtxTime();
|
||||||
|
}
|
||||||
|
|
||||||
MediaChannel* ImplForTesting() override { return impl_; }
|
MediaChannel* ImplForTesting() override { return impl_; }
|
||||||
|
|
||||||
@ -775,6 +784,13 @@ class VideoMediaReceiveChannel : public VideoMediaReceiveChannelInterface {
|
|||||||
bool GetStats(VideoMediaReceiveInfo* info) override {
|
bool GetStats(VideoMediaReceiveInfo* info) override {
|
||||||
return impl_->GetReceiveStats(info);
|
return impl_->GetReceiveStats(info);
|
||||||
}
|
}
|
||||||
|
void SetReceiverFeedbackParameters(bool lntf_enabled,
|
||||||
|
bool nack_enabled,
|
||||||
|
webrtc::RtcpMode rtcp_mode,
|
||||||
|
absl::optional<int> rtx_time) override {
|
||||||
|
impl()->SetReceiverFeedbackParameters(lntf_enabled, nack_enabled, rtcp_mode,
|
||||||
|
rtx_time);
|
||||||
|
}
|
||||||
MediaChannel* ImplForTesting() override { return impl_; }
|
MediaChannel* ImplForTesting() override { return impl_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@ -981,14 +981,13 @@ bool WebRtcVideoChannel::ApplyChangedParams(
|
|||||||
for (auto& kv : send_streams_) {
|
for (auto& kv : send_streams_) {
|
||||||
kv.second->SetSendParameters(changed_params);
|
kv.second->SetSendParameters(changed_params);
|
||||||
}
|
}
|
||||||
|
if (role() == MediaChannel::Role::kBoth) {
|
||||||
if (changed_params.send_codec || changed_params.rtcp_mode) {
|
if (changed_params.send_codec || changed_params.rtcp_mode) {
|
||||||
// Update receive feedback parameters from new codec or RTCP mode.
|
// Update receive feedback parameters from new codec or RTCP mode.
|
||||||
RTC_LOG(LS_INFO)
|
RTC_LOG(LS_INFO) << "SetFeedbackParameters on all the receive streams "
|
||||||
<< "SetFeedbackParameters on all the receive streams because the send "
|
"because the send "
|
||||||
"codec or RTCP mode has changed.";
|
"codec or RTCP mode has changed.";
|
||||||
for (auto& kv : receive_streams_) {
|
SetReceiverFeedbackParameters(
|
||||||
RTC_DCHECK(kv.second != nullptr);
|
|
||||||
kv.second->SetFeedbackParameters(
|
|
||||||
HasLntf(send_codec_->codec), HasNack(send_codec_->codec),
|
HasLntf(send_codec_->codec), HasNack(send_codec_->codec),
|
||||||
send_params_.rtcp.reduced_size ? webrtc::RtcpMode::kReducedSize
|
send_params_.rtcp.reduced_size ? webrtc::RtcpMode::kReducedSize
|
||||||
: webrtc::RtcpMode::kCompound,
|
: webrtc::RtcpMode::kCompound,
|
||||||
@ -998,6 +997,23 @@ bool WebRtcVideoChannel::ApplyChangedParams(
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WebRtcVideoChannel::SetReceiverFeedbackParameters(
|
||||||
|
bool lntf_enabled,
|
||||||
|
bool nack_enabled,
|
||||||
|
webrtc::RtcpMode rtcp_mode,
|
||||||
|
absl::optional<int> rtx_time) {
|
||||||
|
RTC_DCHECK_RUN_ON(&thread_checker_);
|
||||||
|
|
||||||
|
RTC_DCHECK(role() == MediaChannel::Role::kReceive ||
|
||||||
|
role() == MediaChannel::Role::kBoth);
|
||||||
|
// Update receive feedback parameters from new codec or RTCP mode.
|
||||||
|
for (auto& kv : receive_streams_) {
|
||||||
|
RTC_DCHECK(kv.second != nullptr);
|
||||||
|
kv.second->SetFeedbackParameters(lntf_enabled, nack_enabled, rtcp_mode,
|
||||||
|
rtx_time);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
webrtc::RtpParameters WebRtcVideoChannel::GetRtpSendParameters(
|
webrtc::RtpParameters WebRtcVideoChannel::GetRtpSendParameters(
|
||||||
uint32_t ssrc) const {
|
uint32_t ssrc) const {
|
||||||
RTC_DCHECK_RUN_ON(&thread_checker_);
|
RTC_DCHECK_RUN_ON(&thread_checker_);
|
||||||
|
|||||||
@ -231,6 +231,39 @@ class WebRtcVideoChannel : public VideoMediaChannel,
|
|||||||
rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
|
rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
|
||||||
override;
|
override;
|
||||||
|
|
||||||
|
// Information queries to support SetReceiverFeedbackParameters
|
||||||
|
webrtc::RtcpMode SendCodecRtcpMode() const override {
|
||||||
|
RTC_DCHECK_RUN_ON(&thread_checker_);
|
||||||
|
return send_params_.rtcp.reduced_size ? webrtc::RtcpMode::kReducedSize
|
||||||
|
: webrtc::RtcpMode::kCompound;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SendCodecHasLntf() const override {
|
||||||
|
RTC_DCHECK_RUN_ON(&thread_checker_);
|
||||||
|
if (!send_codec_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return HasLntf(send_codec_->codec);
|
||||||
|
}
|
||||||
|
bool SendCodecHasNack() const override {
|
||||||
|
RTC_DCHECK_RUN_ON(&thread_checker_);
|
||||||
|
if (!send_codec_) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return HasNack(send_codec_->codec);
|
||||||
|
}
|
||||||
|
absl::optional<int> SendCodecRtxTime() const override {
|
||||||
|
RTC_DCHECK_RUN_ON(&thread_checker_);
|
||||||
|
if (!send_codec_) {
|
||||||
|
return absl::nullopt;
|
||||||
|
}
|
||||||
|
return send_codec_->rtx_time;
|
||||||
|
}
|
||||||
|
void SetReceiverFeedbackParameters(bool lntf_enabled,
|
||||||
|
bool nack_enabled,
|
||||||
|
webrtc::RtcpMode rtcp_mode,
|
||||||
|
absl::optional<int> rtx_time) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
class WebRtcVideoReceiveStream;
|
class WebRtcVideoReceiveStream;
|
||||||
|
|
||||||
|
|||||||
@ -1064,6 +1064,12 @@ bool VideoChannel::SetLocalContent_w(const MediaContentDescription* content,
|
|||||||
mid().c_str());
|
mid().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// adjust receive streams based on send codec
|
||||||
|
media_receive_channel()->SetReceiverFeedbackParameters(
|
||||||
|
media_send_channel()->SendCodecHasLntf(),
|
||||||
|
media_send_channel()->SendCodecHasNack(),
|
||||||
|
media_send_channel()->SendCodecRtcpMode(),
|
||||||
|
media_send_channel()->SendCodecRtxTime());
|
||||||
last_send_params_ = send_params;
|
last_send_params_ = send_params;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1131,6 +1137,12 @@ bool VideoChannel::SetRemoteContent_w(const MediaContentDescription* content,
|
|||||||
mid().c_str());
|
mid().c_str());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
// adjust receive streams based on send codec
|
||||||
|
media_receive_channel()->SetReceiverFeedbackParameters(
|
||||||
|
media_send_channel()->SendCodecHasLntf(),
|
||||||
|
media_send_channel()->SendCodecHasNack(),
|
||||||
|
media_send_channel()->SendCodecRtcpMode(),
|
||||||
|
media_send_channel()->SendCodecRtxTime());
|
||||||
last_send_params_ = send_params;
|
last_send_params_ = send_params;
|
||||||
|
|
||||||
if (needs_recv_params_update) {
|
if (needs_recv_params_update) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user