Reland "Distinguish between send and receive codecs"

This reverts commit e57b266a20334e47f105a0bd777190ec8c6562e8.

Reason for revert: Fixed negotiation of send-only clients.

Original change's description:
> Revert "Distinguish between send and receive codecs"
>
> This reverts commit c0f25cf762a6946666c812f7a3df3f0a7f98b38d.
>
> Reason for revert: breaks negotiation with send-only clients
>
> (webrtc_video_engine.cc:985): SetRecvParameters called with unsupported video codec: VideoCodec[96:H264]
> (peer_connection.cc:6043): Failed to set local video description recv parameters. (INVALID_PARAMETER)
> (peer_connection.cc:2591): Failed to set local offer sdp: Failed to set local video description recv parameters.
>
> Original change's description:
> > Distinguish between send and receive codecs
> >
> > Even though send and receive codecs may be the same, they might have
> > different support in HW. Distinguish between send and receive codecs
> > to be able to keep track of which codecs have HW support.
> >
> > Bug: chromium:1029737
> > Change-Id: Id119560becadfe0aaf861c892a6485f1c2eb378d
> > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/165763
> > Commit-Queue: Johannes Kron <kron@webrtc.org>
> > Reviewed-by: Steve Anton <steveanton@webrtc.org>
> > Cr-Commit-Position: refs/heads/master@{#30284}
>
> TBR=steveanton@webrtc.org,kron@webrtc.org
>
> Change-Id: Iacb7059436b2313b52577b65f164ee363c4816aa
> No-Presubmit: true
> No-Tree-Checks: true
> No-Try: true
> Bug: chromium:1029737
> Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/166420
> Reviewed-by: Steve Anton <steveanton@webrtc.org>
> Commit-Queue: Steve Anton <steveanton@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#30292}

TBR=steveanton@webrtc.org,kron@webrtc.org


Bug: chromium:1029737
Change-Id: I287efcfdcd1c9a3f2c410aeec8fe26a84204d1fd
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/166604
Reviewed-by: Johannes Kron <kron@webrtc.org>
Reviewed-by: Steve Anton <steveanton@webrtc.org>
Commit-Queue: Johannes Kron <kron@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30348}
This commit is contained in:
Johannes Kron
2020-01-22 13:29:46 +01:00
committed by Commit Bot
parent ede69c0fbe
commit 133bf2bd28
21 changed files with 633 additions and 336 deletions

View File

@ -214,7 +214,9 @@ class PeerConnectionWrapper : public webrtc::PeerConnectionObserver,
dependencies.cert_generator = std::move(cert_generator);
if (!client->Init(nullptr, nullptr, std::move(dependencies), network_thread,
worker_thread, nullptr,
/*media_transport_factory=*/nullptr)) {
/*media_transport_factory=*/nullptr,
/*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false)) {
delete client;
return nullptr;
}
@ -604,7 +606,9 @@ class PeerConnectionWrapper : public webrtc::PeerConnectionObserver,
rtc::Thread* network_thread,
rtc::Thread* worker_thread,
std::unique_ptr<webrtc::FakeRtcEventLogFactory> event_log_factory,
std::unique_ptr<webrtc::MediaTransportFactory> media_transport_factory) {
std::unique_ptr<webrtc::MediaTransportFactory> media_transport_factory,
bool reset_encoder_factory,
bool reset_decoder_factory) {
// There's an error in this test code if Init ends up being called twice.
RTC_DCHECK(!peer_connection_);
RTC_DCHECK(!peer_connection_factory_);
@ -632,6 +636,14 @@ class PeerConnectionWrapper : public webrtc::PeerConnectionObserver,
pc_factory_dependencies.task_queue_factory.get();
media_deps.adm = fake_audio_capture_module_;
webrtc::SetMediaEngineDefaults(&media_deps);
if (reset_encoder_factory) {
media_deps.video_encoder_factory.reset();
}
if (reset_decoder_factory) {
media_deps.video_decoder_factory.reset();
}
pc_factory_dependencies.media_engine =
cricket::CreateMediaEngine(std::move(media_deps));
pc_factory_dependencies.call_factory = webrtc::CreateCallFactory();
@ -1265,7 +1277,9 @@ class PeerConnectionIntegrationBaseTest : public ::testing::Test {
const RTCConfiguration* config,
webrtc::PeerConnectionDependencies dependencies,
std::unique_ptr<webrtc::FakeRtcEventLogFactory> event_log_factory,
std::unique_ptr<webrtc::MediaTransportFactory> media_transport_factory) {
std::unique_ptr<webrtc::MediaTransportFactory> media_transport_factory,
bool reset_encoder_factory,
bool reset_decoder_factory) {
RTCConfiguration modified_config;
if (config) {
modified_config = *config;
@ -1281,7 +1295,8 @@ class PeerConnectionIntegrationBaseTest : public ::testing::Test {
if (!client->Init(options, &modified_config, std::move(dependencies),
network_thread_.get(), worker_thread_.get(),
std::move(event_log_factory),
std::move(media_transport_factory))) {
std::move(media_transport_factory), reset_encoder_factory,
reset_decoder_factory)) {
return nullptr;
}
return client;
@ -1295,10 +1310,11 @@ class PeerConnectionIntegrationBaseTest : public ::testing::Test {
webrtc::PeerConnectionDependencies dependencies) {
std::unique_ptr<webrtc::FakeRtcEventLogFactory> event_log_factory(
new webrtc::FakeRtcEventLogFactory(rtc::Thread::Current()));
return CreatePeerConnectionWrapper(debug_name, options, config,
std::move(dependencies),
std::move(event_log_factory),
/*media_transport_factory=*/nullptr);
return CreatePeerConnectionWrapper(
debug_name, options, config, std::move(dependencies),
std::move(event_log_factory),
/*media_transport_factory=*/nullptr, /*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false);
}
bool CreatePeerConnectionWrappers() {
@ -1319,11 +1335,15 @@ class PeerConnectionIntegrationBaseTest : public ::testing::Test {
sdp_semantics_ = caller_semantics;
caller_ = CreatePeerConnectionWrapper(
"Caller", nullptr, nullptr, webrtc::PeerConnectionDependencies(nullptr),
nullptr, /*media_transport_factory=*/nullptr);
nullptr, /*media_transport_factory=*/nullptr,
/*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false);
sdp_semantics_ = callee_semantics;
callee_ = CreatePeerConnectionWrapper(
"Callee", nullptr, nullptr, webrtc::PeerConnectionDependencies(nullptr),
nullptr, /*media_transport_factory=*/nullptr);
nullptr, /*media_transport_factory=*/nullptr,
/*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false);
sdp_semantics_ = original_semantics;
return caller_ && callee_;
}
@ -1334,11 +1354,13 @@ class PeerConnectionIntegrationBaseTest : public ::testing::Test {
caller_ = CreatePeerConnectionWrapper(
"Caller", nullptr, &caller_config,
webrtc::PeerConnectionDependencies(nullptr), nullptr,
/*media_transport_factory=*/nullptr);
/*media_transport_factory=*/nullptr, /*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false);
callee_ = CreatePeerConnectionWrapper(
"Callee", nullptr, &callee_config,
webrtc::PeerConnectionDependencies(nullptr), nullptr,
/*media_transport_factory=*/nullptr);
/*media_transport_factory=*/nullptr, /*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false);
return caller_ && callee_;
}
@ -1347,14 +1369,16 @@ class PeerConnectionIntegrationBaseTest : public ::testing::Test {
const PeerConnectionInterface::RTCConfiguration& callee_config,
std::unique_ptr<webrtc::MediaTransportFactory> caller_factory,
std::unique_ptr<webrtc::MediaTransportFactory> callee_factory) {
caller_ =
CreatePeerConnectionWrapper("Caller", nullptr, &caller_config,
webrtc::PeerConnectionDependencies(nullptr),
nullptr, std::move(caller_factory));
callee_ =
CreatePeerConnectionWrapper("Callee", nullptr, &callee_config,
webrtc::PeerConnectionDependencies(nullptr),
nullptr, std::move(callee_factory));
caller_ = CreatePeerConnectionWrapper(
"Caller", nullptr, &caller_config,
webrtc::PeerConnectionDependencies(nullptr), nullptr,
std::move(caller_factory), /*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false);
callee_ = CreatePeerConnectionWrapper(
"Callee", nullptr, &callee_config,
webrtc::PeerConnectionDependencies(nullptr), nullptr,
std::move(callee_factory), /*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false);
return caller_ && callee_;
}
@ -1363,14 +1387,16 @@ class PeerConnectionIntegrationBaseTest : public ::testing::Test {
webrtc::PeerConnectionDependencies caller_dependencies,
const PeerConnectionInterface::RTCConfiguration& callee_config,
webrtc::PeerConnectionDependencies callee_dependencies) {
caller_ =
CreatePeerConnectionWrapper("Caller", nullptr, &caller_config,
std::move(caller_dependencies), nullptr,
/*media_transport_factory=*/nullptr);
callee_ =
CreatePeerConnectionWrapper("Callee", nullptr, &callee_config,
std::move(callee_dependencies), nullptr,
/*media_transport_factory=*/nullptr);
caller_ = CreatePeerConnectionWrapper(
"Caller", nullptr, &caller_config, std::move(caller_dependencies),
nullptr,
/*media_transport_factory=*/nullptr, /*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false);
callee_ = CreatePeerConnectionWrapper(
"Callee", nullptr, &callee_config, std::move(callee_dependencies),
nullptr,
/*media_transport_factory=*/nullptr, /*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false);
return caller_ && callee_;
}
@ -1380,11 +1406,13 @@ class PeerConnectionIntegrationBaseTest : public ::testing::Test {
caller_ = CreatePeerConnectionWrapper(
"Caller", &caller_options, nullptr,
webrtc::PeerConnectionDependencies(nullptr), nullptr,
/*media_transport_factory=*/nullptr);
/*media_transport_factory=*/nullptr, /*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false);
callee_ = CreatePeerConnectionWrapper(
"Callee", &callee_options, nullptr,
webrtc::PeerConnectionDependencies(nullptr), nullptr,
/*media_transport_factory=*/nullptr);
/*media_transport_factory=*/nullptr, /*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false);
return caller_ && callee_;
}
@ -1407,9 +1435,24 @@ class PeerConnectionIntegrationBaseTest : public ::testing::Test {
webrtc::PeerConnectionDependencies dependencies(nullptr);
dependencies.cert_generator = std::move(cert_generator);
return CreatePeerConnectionWrapper("New Peer", nullptr, nullptr,
std::move(dependencies), nullptr,
/*media_transport_factory=*/nullptr);
return CreatePeerConnectionWrapper(
"New Peer", nullptr, nullptr, std::move(dependencies), nullptr,
/*media_transport_factory=*/nullptr, /*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false);
}
bool CreateOneDirectionalPeerConnectionWrappers(bool caller_to_callee) {
caller_ = CreatePeerConnectionWrapper(
"Caller", nullptr, nullptr, webrtc::PeerConnectionDependencies(nullptr),
nullptr, /*media_transport_factory=*/nullptr,
/*reset_encoder_factory=*/!caller_to_callee,
/*reset_decoder_factory=*/caller_to_callee);
callee_ = CreatePeerConnectionWrapper(
"Callee", nullptr, nullptr, webrtc::PeerConnectionDependencies(nullptr),
nullptr, /*media_transport_factory=*/nullptr,
/*reset_encoder_factory=*/caller_to_callee,
/*reset_decoder_factory=*/!caller_to_callee);
return caller_ && callee_;
}
cricket::TestTurnServer* CreateTurnServer(
@ -2038,6 +2081,56 @@ TEST_P(PeerConnectionIntegrationTest, OneWayMediaCall) {
ASSERT_TRUE(ExpectNewFrames(media_expectations));
}
// Tests that send only works without the caller having a decoder factory and
// the callee having an encoder factory.
TEST_P(PeerConnectionIntegrationTest, EndToEndCallWithSendOnlyVideo) {
ASSERT_TRUE(
CreateOneDirectionalPeerConnectionWrappers(/*caller_to_callee=*/true));
ConnectFakeSignaling();
// Add one-directional video, from caller to callee.
rtc::scoped_refptr<webrtc::VideoTrackInterface> track =
caller()->CreateLocalVideoTrack();
caller()->AddTrack(track);
PeerConnectionInterface::RTCOfferAnswerOptions options;
options.offer_to_receive_video = 0;
caller()->SetOfferAnswerOptions(options);
caller()->CreateAndSetAndSignalOffer();
ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
ASSERT_EQ(callee()->pc()->GetReceivers().size(), 1u);
// Expect video to be received in one direction.
MediaExpectations media_expectations;
media_expectations.CallerExpectsNoVideo();
media_expectations.CalleeExpectsSomeVideo();
EXPECT_TRUE(ExpectNewFrames(media_expectations));
}
// Tests that receive only works without the caller having an encoder factory
// and the callee having a dncoder factory.
TEST_P(PeerConnectionIntegrationTest, EndToEndCallWithReceiveOnlyVideo) {
ASSERT_TRUE(
CreateOneDirectionalPeerConnectionWrappers(/*caller_to_callee=*/false));
ConnectFakeSignaling();
// Add one-directional video, from caller to callee.
rtc::scoped_refptr<webrtc::VideoTrackInterface> track =
callee()->CreateLocalVideoTrack();
callee()->AddTrack(track);
PeerConnectionInterface::RTCOfferAnswerOptions options;
options.offer_to_receive_video = 1;
caller()->SetOfferAnswerOptions(options);
caller()->CreateAndSetAndSignalOffer();
ASSERT_TRUE_WAIT(SignalingStateStable(), kDefaultTimeout);
ASSERT_EQ(caller()->pc()->GetReceivers().size(), 1u);
// Expect video to be received in one direction.
MediaExpectations media_expectations;
media_expectations.CallerExpectsSomeVideo();
media_expectations.CalleeExpectsNoVideo();
EXPECT_TRUE(ExpectNewFrames(media_expectations));
}
// This test sets up a audio call initially, with the callee rejecting video
// initially. Then later the callee decides to upgrade to audio/video, and
// initiates a new offer/answer exchange.
@ -5256,9 +5349,10 @@ TEST_P(PeerConnectionIntegrationTest, IceTransportFactoryUsedForConnections) {
auto ice_transport_factory = std::make_unique<MockIceTransportFactory>();
EXPECT_CALL(*ice_transport_factory, RecordIceTransportCreated()).Times(1);
dependencies.ice_transport_factory = std::move(ice_transport_factory);
auto wrapper =
CreatePeerConnectionWrapper("Caller", nullptr, &default_config,
std::move(dependencies), nullptr, nullptr);
auto wrapper = CreatePeerConnectionWrapper(
"Caller", nullptr, &default_config, std::move(dependencies), nullptr,
nullptr, /*reset_encoder_factory=*/false,
/*reset_decoder_factory=*/false);
ASSERT_TRUE(wrapper);
wrapper->CreateDataChannel();
rtc::scoped_refptr<MockSetSessionDescriptionObserver> observer(