Add ability to turn on conference mode during simulcast in PC framework.
Bug: webrtc:10138 Change-Id: I9ccb9674285121c8561745babc7e2109588d5053 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/146081 Reviewed-by: Stefan Holmer <stefan@webrtc.org> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Commit-Queue: Artem Titov <titovartem@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28599}
This commit is contained in:
@ -136,6 +136,8 @@ class PeerConnectionE2EQualityTestFixture {
|
|||||||
// spatial layer and all layers below, including target one will be
|
// spatial layer and all layers below, including target one will be
|
||||||
// processed. All layers above target one will be dropped.
|
// processed. All layers above target one will be dropped.
|
||||||
int target_spatial_index;
|
int target_spatial_index;
|
||||||
|
// If true will set conference mode in SDP media section for this track.
|
||||||
|
bool use_conference_mode = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Contains properties of single video stream.
|
// Contains properties of single video stream.
|
||||||
|
@ -487,6 +487,7 @@ rtc_source_set("sdp_changer") {
|
|||||||
deps = [
|
deps = [
|
||||||
"../../../api:array_view",
|
"../../../api:array_view",
|
||||||
"../../../api:libjingle_peerconnection_api",
|
"../../../api:libjingle_peerconnection_api",
|
||||||
|
"../../../api:peer_connection_quality_test_fixture_api",
|
||||||
"../../../media:rtc_media_base",
|
"../../../media:rtc_media_base",
|
||||||
"../../../p2p:rtc_p2p",
|
"../../../p2p:rtc_p2p",
|
||||||
"../../../pc:peerconnection",
|
"../../../pc:peerconnection",
|
||||||
|
@ -823,7 +823,17 @@ void PeerConnectionE2EQualityTest::SetPeerCodecPreferences(
|
|||||||
}
|
}
|
||||||
|
|
||||||
void PeerConnectionE2EQualityTest::SetupCall() {
|
void PeerConnectionE2EQualityTest::SetupCall() {
|
||||||
SignalingInterceptor signaling_interceptor;
|
std::map<std::string, VideoSimulcastConfig> stream_label_to_simulcast_config;
|
||||||
|
// We add only Alice here, because simulcast/svc is supported only from the
|
||||||
|
// first peer.
|
||||||
|
for (auto& video_config : alice_->params()->video_configs) {
|
||||||
|
if (video_config.simulcast_config) {
|
||||||
|
stream_label_to_simulcast_config.insert(
|
||||||
|
{*video_config.stream_label, *video_config.simulcast_config});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
PatchingParams patching_params(stream_label_to_simulcast_config);
|
||||||
|
SignalingInterceptor signaling_interceptor(patching_params);
|
||||||
// Connect peers.
|
// Connect peers.
|
||||||
ExchangeOfferAnswer(&signaling_interceptor);
|
ExchangeOfferAnswer(&signaling_interceptor);
|
||||||
// Do the SDP negotiation, and also exchange ice candidates.
|
// Do the SDP negotiation, and also exchange ice candidates.
|
||||||
|
@ -167,6 +167,8 @@ class PeerConnectionE2EQualityTest
|
|||||||
PeerConnectionE2EQualityTestFixture::VideoGeneratorType;
|
PeerConnectionE2EQualityTestFixture::VideoGeneratorType;
|
||||||
using RunParams = PeerConnectionE2EQualityTestFixture::RunParams;
|
using RunParams = PeerConnectionE2EQualityTestFixture::RunParams;
|
||||||
using VideoConfig = PeerConnectionE2EQualityTestFixture::VideoConfig;
|
using VideoConfig = PeerConnectionE2EQualityTestFixture::VideoConfig;
|
||||||
|
using VideoSimulcastConfig =
|
||||||
|
PeerConnectionE2EQualityTestFixture::VideoSimulcastConfig;
|
||||||
using PeerConfigurer = PeerConnectionE2EQualityTestFixture::PeerConfigurer;
|
using PeerConfigurer = PeerConnectionE2EQualityTestFixture::PeerConfigurer;
|
||||||
using QualityMetricsReporter =
|
using QualityMetricsReporter =
|
||||||
PeerConnectionE2EQualityTestFixture::QualityMetricsReporter;
|
PeerConnectionE2EQualityTestFixture::QualityMetricsReporter;
|
||||||
|
@ -88,7 +88,8 @@ std::vector<RtpCodecCapability> FilterVideoCodecCapabilities(
|
|||||||
// If offer has no simulcast video sections - do nothing.
|
// If offer has no simulcast video sections - do nothing.
|
||||||
//
|
//
|
||||||
// If offer has simulcast video sections - for each section creates
|
// If offer has simulcast video sections - for each section creates
|
||||||
// SimulcastSectionInfo and put it into |context_|.
|
// SimulcastSectionInfo and put it into |context_|. Also will set conference
|
||||||
|
// mode if requested.
|
||||||
void SignalingInterceptor::FillContext(SessionDescriptionInterface* offer) {
|
void SignalingInterceptor::FillContext(SessionDescriptionInterface* offer) {
|
||||||
for (auto& content : offer->description()->contents()) {
|
for (auto& content : offer->description()->contents()) {
|
||||||
context_.mids_order.push_back(content.mid());
|
context_.mids_order.push_back(content.mid());
|
||||||
@ -101,9 +102,23 @@ void SignalingInterceptor::FillContext(SessionDescriptionInterface* offer) {
|
|||||||
RTC_CHECK_EQ(media_desc->mutable_streams().size(), 1);
|
RTC_CHECK_EQ(media_desc->mutable_streams().size(), 1);
|
||||||
RTC_CHECK(media_desc->mutable_streams()[0].has_rids());
|
RTC_CHECK(media_desc->mutable_streams()[0].has_rids());
|
||||||
|
|
||||||
|
// Extract stream label, that was used when we added the stream.
|
||||||
|
cricket::StreamParams& stream = media_desc->mutable_streams()[0];
|
||||||
|
RTC_CHECK(stream.stream_ids().size() == 1)
|
||||||
|
<< "Too many stream ids in video stream";
|
||||||
|
std::string stream_label = stream.stream_ids()[0];
|
||||||
|
|
||||||
|
bool conference_mode =
|
||||||
|
params_.stream_label_to_simulcast_config.at(stream_label)
|
||||||
|
.use_conference_mode;
|
||||||
|
|
||||||
// Create SimulcastSectionInfo for this video section.
|
// Create SimulcastSectionInfo for this video section.
|
||||||
SimulcastSectionInfo info(content.mid(), content.type,
|
SimulcastSectionInfo info(content.mid(), content.type,
|
||||||
media_desc->mutable_streams()[0].rids());
|
media_desc->mutable_streams()[0].rids(),
|
||||||
|
conference_mode);
|
||||||
|
|
||||||
|
// Set conference mode if requested
|
||||||
|
media_desc->set_conference_mode(conference_mode);
|
||||||
|
|
||||||
// Set new rids basing on created SimulcastSectionInfo.
|
// Set new rids basing on created SimulcastSectionInfo.
|
||||||
std::vector<cricket::RidDescription> rids;
|
std::vector<cricket::RidDescription> rids;
|
||||||
@ -168,6 +183,7 @@ LocalAndRemoteSdp SignalingInterceptor::PatchOffer(
|
|||||||
// because otherwise description will be deleted.
|
// because otherwise description will be deleted.
|
||||||
std::unique_ptr<cricket::MediaContentDescription> prototype_media_desc =
|
std::unique_ptr<cricket::MediaContentDescription> prototype_media_desc =
|
||||||
absl::WrapUnique(simulcast_content->media_description()->Copy());
|
absl::WrapUnique(simulcast_content->media_description()->Copy());
|
||||||
|
prototype_media_desc->set_conference_mode(false);
|
||||||
|
|
||||||
// Remove simulcast video section from offer.
|
// Remove simulcast video section from offer.
|
||||||
RTC_CHECK(desc->RemoveContentByName(simulcast_content->mid()));
|
RTC_CHECK(desc->RemoveContentByName(simulcast_content->mid()));
|
||||||
@ -334,6 +350,9 @@ LocalAndRemoteSdp SignalingInterceptor::PatchAnswer(
|
|||||||
}
|
}
|
||||||
media_desc->set_simulcast_description(simulcast_description);
|
media_desc->set_simulcast_description(simulcast_description);
|
||||||
|
|
||||||
|
// Set conference mode if requested.
|
||||||
|
media_desc->set_conference_mode(info.conference_mode);
|
||||||
|
|
||||||
// Add simulcast media section.
|
// Add simulcast media section.
|
||||||
desc->AddContent(info.mid, info.media_protocol_type, std::move(media_desc));
|
desc->AddContent(info.mid, info.media_protocol_type, std::move(media_desc));
|
||||||
}
|
}
|
||||||
@ -427,8 +446,11 @@ SignalingInterceptor::PatchAnswererIceCandidates(
|
|||||||
SignalingInterceptor::SimulcastSectionInfo::SimulcastSectionInfo(
|
SignalingInterceptor::SimulcastSectionInfo::SimulcastSectionInfo(
|
||||||
const std::string& mid,
|
const std::string& mid,
|
||||||
cricket::MediaProtocolType media_protocol_type,
|
cricket::MediaProtocolType media_protocol_type,
|
||||||
const std::vector<cricket::RidDescription>& rids_desc)
|
const std::vector<cricket::RidDescription>& rids_desc,
|
||||||
: mid(mid), media_protocol_type(media_protocol_type) {
|
bool conference_mode)
|
||||||
|
: mid(mid),
|
||||||
|
media_protocol_type(media_protocol_type),
|
||||||
|
conference_mode(conference_mode) {
|
||||||
for (auto& rid : rids_desc) {
|
for (auto& rid : rids_desc) {
|
||||||
rids.push_back(rid.rid);
|
rids.push_back(rid.rid);
|
||||||
}
|
}
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include "api/array_view.h"
|
#include "api/array_view.h"
|
||||||
#include "api/jsep.h"
|
#include "api/jsep.h"
|
||||||
#include "api/rtp_parameters.h"
|
#include "api/rtp_parameters.h"
|
||||||
|
#include "api/test/peerconnection_quality_test_fixture.h"
|
||||||
#include "media/base/rid_description.h"
|
#include "media/base/rid_description.h"
|
||||||
#include "pc/session_description.h"
|
#include "pc/session_description.h"
|
||||||
#include "pc/simulcast_description.h"
|
#include "pc/simulcast_description.h"
|
||||||
@ -59,8 +60,22 @@ struct LocalAndRemoteSdp {
|
|||||||
std::unique_ptr<SessionDescriptionInterface> remote_sdp;
|
std::unique_ptr<SessionDescriptionInterface> remote_sdp;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct PatchingParams {
|
||||||
|
PatchingParams(
|
||||||
|
std::map<std::string,
|
||||||
|
PeerConnectionE2EQualityTestFixture::VideoSimulcastConfig>
|
||||||
|
stream_label_to_simulcast_config)
|
||||||
|
: stream_label_to_simulcast_config(stream_label_to_simulcast_config) {}
|
||||||
|
|
||||||
|
std::map<std::string,
|
||||||
|
PeerConnectionE2EQualityTestFixture::VideoSimulcastConfig>
|
||||||
|
stream_label_to_simulcast_config;
|
||||||
|
};
|
||||||
|
|
||||||
class SignalingInterceptor {
|
class SignalingInterceptor {
|
||||||
public:
|
public:
|
||||||
|
explicit SignalingInterceptor(PatchingParams params) : params_(params) {}
|
||||||
|
|
||||||
LocalAndRemoteSdp PatchOffer(
|
LocalAndRemoteSdp PatchOffer(
|
||||||
std::unique_ptr<SessionDescriptionInterface> offer);
|
std::unique_ptr<SessionDescriptionInterface> offer);
|
||||||
LocalAndRemoteSdp PatchAnswer(
|
LocalAndRemoteSdp PatchAnswer(
|
||||||
@ -78,10 +93,12 @@ class SignalingInterceptor {
|
|||||||
struct SimulcastSectionInfo {
|
struct SimulcastSectionInfo {
|
||||||
SimulcastSectionInfo(const std::string& mid,
|
SimulcastSectionInfo(const std::string& mid,
|
||||||
cricket::MediaProtocolType media_protocol_type,
|
cricket::MediaProtocolType media_protocol_type,
|
||||||
const std::vector<cricket::RidDescription>& rids_desc);
|
const std::vector<cricket::RidDescription>& rids_desc,
|
||||||
|
bool conference_mode);
|
||||||
|
|
||||||
const std::string mid;
|
const std::string mid;
|
||||||
const cricket::MediaProtocolType media_protocol_type;
|
const cricket::MediaProtocolType media_protocol_type;
|
||||||
|
const bool conference_mode;
|
||||||
std::vector<std::string> rids;
|
std::vector<std::string> rids;
|
||||||
cricket::SimulcastDescription simulcast_description;
|
cricket::SimulcastDescription simulcast_description;
|
||||||
webrtc::RtpExtension mid_extension;
|
webrtc::RtpExtension mid_extension;
|
||||||
@ -112,6 +129,7 @@ class SignalingInterceptor {
|
|||||||
std::unique_ptr<cricket::SessionDescription> RestoreMediaSectionsOrder(
|
std::unique_ptr<cricket::SessionDescription> RestoreMediaSectionsOrder(
|
||||||
std::unique_ptr<cricket::SessionDescription> source);
|
std::unique_ptr<cricket::SessionDescription> source);
|
||||||
|
|
||||||
|
PatchingParams params_;
|
||||||
SignalingContext context_;
|
SignalingContext context_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user