Update talk to 59410372.
R=jiayl@webrtc.org, wu@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/6929004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@5367 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/media/webrtc/webrtcvideoengine_unittest.cc b/talk/media/webrtc/webrtcvideoengine_unittest.cc
index d5886a1..b10b11f 100644
--- a/talk/media/webrtc/webrtcvideoengine_unittest.cc
+++ b/talk/media/webrtc/webrtcvideoengine_unittest.cc
@@ -147,6 +147,20 @@
channel_->SendFrame(&capturer, &frame);
return true;
}
+ void VerifyCodecFeedbackParams(const cricket::VideoCodec& codec) {
+ EXPECT_TRUE(codec.HasFeedbackParam(
+ cricket::FeedbackParam(cricket::kRtcpFbParamNack,
+ cricket::kParamValueEmpty)));
+ EXPECT_TRUE(codec.HasFeedbackParam(
+ cricket::FeedbackParam(cricket::kRtcpFbParamNack,
+ cricket::kRtcpFbNackParamPli)));
+ EXPECT_TRUE(codec.HasFeedbackParam(
+ cricket::FeedbackParam(cricket::kRtcpFbParamRemb,
+ cricket::kParamValueEmpty)));
+ EXPECT_TRUE(codec.HasFeedbackParam(
+ cricket::FeedbackParam(cricket::kRtcpFbParamCcm,
+ cricket::kRtcpFbCcmParamFir)));
+ }
void VerifyVP8SendCodec(int channel_num,
unsigned int width,
unsigned int height,
@@ -237,8 +251,10 @@
EXPECT_EQ(talk_base::LS_INFO, talk_base::LogMessage::GetLogToStream(&stream));
webrtc::Trace::Add(webrtc::kTraceStateInfo, webrtc::kTraceUndefined, 0,
webrtc_log);
- EXPECT_TRUE_WAIT(std::string::npos != str.find(webrtc_log), 10);
+ talk_base::Thread::Current()->ProcessMessages(100);
talk_base::LogMessage::RemoveLogToStream(&stream);
+ // Access |str| after LogMessage is done with it to avoid data racing.
+ EXPECT_NE(std::string::npos, str.find(webrtc_log));
}
// Tests that webrtc logs are not logged when they should't be.
@@ -889,6 +905,17 @@
EXPECT_EQ(channel_num, vie_.GetLastChannel());
}
+// Test that NACK, PLI and REMB are enabled for internal codec.
+TEST_F(WebRtcVideoEngineTestFake, InternalCodecFeedbackParams) {
+ EXPECT_TRUE(SetupEngine());
+
+ std::vector<cricket::VideoCodec> codecs(engine_.codecs());
+ // Vp8 will appear at the beginning.
+ size_t pos = 0;
+ EXPECT_EQ("VP8", codecs[pos].name);
+ VerifyCodecFeedbackParams(codecs[pos]);
+}
+
// Test that AddRecvStream doesn't change remb for 1:1 call.
TEST_F(WebRtcVideoEngineTestFake, NoRembChangeAfterAddRecvStream) {
EXPECT_TRUE(SetupEngine());
@@ -1395,6 +1422,322 @@
}
+TEST_F(WebRtcVideoEngineTestFake, ResetCodecOnScreencast) {
+ EXPECT_TRUE(SetupEngine());
+ cricket::VideoOptions options;
+ options.video_noise_reduction.Set(true);
+ EXPECT_TRUE(channel_->SetOptions(options));
+
+ // Set send codec.
+ cricket::VideoCodec codec(kVP8Codec);
+ std::vector<cricket::VideoCodec> codec_list;
+ codec_list.push_back(codec);
+ EXPECT_TRUE(channel_->AddSendStream(
+ cricket::StreamParams::CreateLegacy(123)));
+ EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
+ EXPECT_TRUE(channel_->SetSend(true));
+ EXPECT_EQ(1, vie_.num_set_send_codecs());
+
+ webrtc::VideoCodec gcodec;
+ memset(&gcodec, 0, sizeof(gcodec));
+ int channel_num = vie_.GetLastChannel();
+ EXPECT_EQ(0, vie_.GetSendCodec(channel_num, gcodec));
+ EXPECT_TRUE(gcodec.codecSpecific.VP8.denoisingOn);
+
+ // Send a screencast frame with the same size.
+ // Verify that denoising is turned off.
+ SendI420ScreencastFrame(kVP8Codec.width, kVP8Codec.height);
+ EXPECT_EQ(2, vie_.num_set_send_codecs());
+ EXPECT_EQ(0, vie_.GetSendCodec(channel_num, gcodec));
+ EXPECT_FALSE(gcodec.codecSpecific.VP8.denoisingOn);
+}
+
+
+TEST_F(WebRtcVideoEngineTestFake, DontRegisterDecoderIfFactoryIsNotGiven) {
+ engine_.SetExternalDecoderFactory(NULL);
+ EXPECT_TRUE(SetupEngine());
+ int channel_num = vie_.GetLastChannel();
+
+ std::vector<cricket::VideoCodec> codecs;
+ codecs.push_back(kVP8Codec);
+ EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
+
+ EXPECT_EQ(0, vie_.GetNumExternalDecoderRegistered(channel_num));
+}
+
+TEST_F(WebRtcVideoEngineTestFake, RegisterDecoderIfFactoryIsGiven) {
+ decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
+ engine_.SetExternalDecoderFactory(&decoder_factory_);
+ EXPECT_TRUE(SetupEngine());
+ int channel_num = vie_.GetLastChannel();
+
+ std::vector<cricket::VideoCodec> codecs;
+ codecs.push_back(kVP8Codec);
+ EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
+
+ EXPECT_TRUE(vie_.ExternalDecoderRegistered(channel_num, 100));
+ EXPECT_EQ(1, vie_.GetNumExternalDecoderRegistered(channel_num));
+}
+
+TEST_F(WebRtcVideoEngineTestFake, DontRegisterDecoderMultipleTimes) {
+ decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
+ engine_.SetExternalDecoderFactory(&decoder_factory_);
+ EXPECT_TRUE(SetupEngine());
+ int channel_num = vie_.GetLastChannel();
+
+ std::vector<cricket::VideoCodec> codecs;
+ codecs.push_back(kVP8Codec);
+ EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
+
+ EXPECT_TRUE(vie_.ExternalDecoderRegistered(channel_num, 100));
+ EXPECT_EQ(1, vie_.GetNumExternalDecoderRegistered(channel_num));
+ EXPECT_EQ(1, decoder_factory_.GetNumCreatedDecoders());
+
+ EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
+ EXPECT_EQ(1, vie_.GetNumExternalDecoderRegistered(channel_num));
+ EXPECT_EQ(1, decoder_factory_.GetNumCreatedDecoders());
+}
+
+TEST_F(WebRtcVideoEngineTestFake, DontRegisterDecoderForNonVP8) {
+ decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
+ engine_.SetExternalDecoderFactory(&decoder_factory_);
+ EXPECT_TRUE(SetupEngine());
+ int channel_num = vie_.GetLastChannel();
+
+ std::vector<cricket::VideoCodec> codecs;
+ codecs.push_back(kRedCodec);
+ EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
+
+ EXPECT_EQ(0, vie_.GetNumExternalDecoderRegistered(channel_num));
+}
+
+TEST_F(WebRtcVideoEngineTestFake, DontRegisterEncoderIfFactoryIsNotGiven) {
+ engine_.SetExternalEncoderFactory(NULL);
+ EXPECT_TRUE(SetupEngine());
+ int channel_num = vie_.GetLastChannel();
+
+ std::vector<cricket::VideoCodec> codecs;
+ codecs.push_back(kVP8Codec);
+ EXPECT_TRUE(channel_->SetSendCodecs(codecs));
+
+ EXPECT_EQ(0, vie_.GetNumExternalEncoderRegistered(channel_num));
+}
+
+TEST_F(WebRtcVideoEngineTestFake, RegisterEncoderIfFactoryIsGiven) {
+ encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
+ engine_.SetExternalEncoderFactory(&encoder_factory_);
+ EXPECT_TRUE(SetupEngine());
+ int channel_num = vie_.GetLastChannel();
+
+ std::vector<cricket::VideoCodec> codecs;
+ codecs.push_back(kVP8Codec);
+ EXPECT_TRUE(channel_->SetSendCodecs(codecs));
+
+ EXPECT_TRUE(channel_->AddSendStream(
+ cricket::StreamParams::CreateLegacy(kSsrc)));
+
+ EXPECT_TRUE(vie_.ExternalEncoderRegistered(channel_num, 100));
+ EXPECT_EQ(1, vie_.GetNumExternalEncoderRegistered(channel_num));
+
+ // Remove stream previously added to free the external encoder instance.
+ EXPECT_TRUE(channel_->RemoveSendStream(kSsrc));
+}
+
+TEST_F(WebRtcVideoEngineTestFake, DontRegisterEncoderMultipleTimes) {
+ encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
+ engine_.SetExternalEncoderFactory(&encoder_factory_);
+ EXPECT_TRUE(SetupEngine());
+ int channel_num = vie_.GetLastChannel();
+
+ std::vector<cricket::VideoCodec> codecs;
+ codecs.push_back(kVP8Codec);
+ EXPECT_TRUE(channel_->SetSendCodecs(codecs));
+
+ EXPECT_TRUE(channel_->AddSendStream(
+ cricket::StreamParams::CreateLegacy(kSsrc)));
+
+ EXPECT_TRUE(vie_.ExternalEncoderRegistered(channel_num, 100));
+ EXPECT_EQ(1, vie_.GetNumExternalEncoderRegistered(channel_num));
+ EXPECT_EQ(1, encoder_factory_.GetNumCreatedEncoders());
+
+ EXPECT_TRUE(channel_->SetSendCodecs(codecs));
+ EXPECT_EQ(1, vie_.GetNumExternalEncoderRegistered(channel_num));
+ EXPECT_EQ(1, encoder_factory_.GetNumCreatedEncoders());
+
+ // Remove stream previously added to free the external encoder instance.
+ EXPECT_TRUE(channel_->RemoveSendStream(kSsrc));
+}
+
+TEST_F(WebRtcVideoEngineTestFake, RegisterEncoderWithMultipleSendStreams) {
+ encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
+ engine_.SetExternalEncoderFactory(&encoder_factory_);
+ EXPECT_TRUE(SetupEngine());
+
+ std::vector<cricket::VideoCodec> codecs;
+ codecs.push_back(kVP8Codec);
+ EXPECT_TRUE(channel_->SetSendCodecs(codecs));
+ EXPECT_EQ(1, vie_.GetTotalNumExternalEncoderRegistered());
+
+ // When we add the first stream (1234), it reuses the default send channel,
+ // so it doesn't increase the registration count of external encoders.
+ EXPECT_TRUE(channel_->AddSendStream(
+ cricket::StreamParams::CreateLegacy(1234)));
+ EXPECT_EQ(1, vie_.GetTotalNumExternalEncoderRegistered());
+
+ // When we add the second stream (2345), it creates a new channel and
+ // increments the registration count.
+ EXPECT_TRUE(channel_->AddSendStream(
+ cricket::StreamParams::CreateLegacy(2345)));
+ EXPECT_EQ(2, vie_.GetTotalNumExternalEncoderRegistered());
+
+ // At this moment the total registration count is two, but only one encoder
+ // is registered per channel.
+ int channel_num = vie_.GetLastChannel();
+ EXPECT_EQ(1, vie_.GetNumExternalEncoderRegistered(channel_num));
+
+ // Removing send streams decrements the registration count.
+ EXPECT_TRUE(channel_->RemoveSendStream(1234));
+ EXPECT_EQ(1, vie_.GetTotalNumExternalEncoderRegistered());
+
+ // When we remove the last send stream, it also destroys the last send
+ // channel and causes the registration count to drop to zero. It is a little
+ // weird, but not a bug.
+ EXPECT_TRUE(channel_->RemoveSendStream(2345));
+ EXPECT_EQ(0, vie_.GetTotalNumExternalEncoderRegistered());
+}
+
+TEST_F(WebRtcVideoEngineTestFake, DontRegisterEncoderForNonVP8) {
+ encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecGeneric,
+ "GENERIC");
+ engine_.SetExternalEncoderFactory(&encoder_factory_);
+ EXPECT_TRUE(SetupEngine());
+ int channel_num = vie_.GetLastChannel();
+
+ // Note: unlike the SetRecvCodecs, we must set a valid video codec for
+ // channel_->SetSendCodecs() to succeed.
+ std::vector<cricket::VideoCodec> codecs;
+ codecs.push_back(kVP8Codec);
+ EXPECT_TRUE(channel_->SetSendCodecs(codecs));
+
+ EXPECT_EQ(0, vie_.GetNumExternalEncoderRegistered(channel_num));
+}
+
+// Test that NACK, PLI and REMB are enabled for external codec.
+TEST_F(WebRtcVideoEngineTestFake, ExternalCodecFeedbackParams) {
+ encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecGeneric,
+ "GENERIC");
+ engine_.SetExternalEncoderFactory(&encoder_factory_);
+ encoder_factory_.NotifyCodecsAvailable();
+ EXPECT_TRUE(SetupEngine());
+
+ std::vector<cricket::VideoCodec> codecs(engine_.codecs());
+ // The external codec will appear at last.
+ size_t pos = codecs.size() - 1;
+ EXPECT_EQ("GENERIC", codecs[pos].name);
+ VerifyCodecFeedbackParams(codecs[pos]);
+}
+
+// Test external codec with be added to the end of the supported codec list.
+TEST_F(WebRtcVideoEngineTestFake, ExternalCodecAddedToTheEnd) {
+ EXPECT_TRUE(SetupEngine());
+
+ std::vector<cricket::VideoCodec> codecs(engine_.codecs());
+ EXPECT_EQ("VP8", codecs[0].name);
+
+ encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecGeneric,
+ "GENERIC");
+ engine_.SetExternalEncoderFactory(&encoder_factory_);
+ encoder_factory_.NotifyCodecsAvailable();
+
+ codecs = engine_.codecs();
+ cricket::VideoCodec internal_codec = codecs[0];
+ cricket::VideoCodec external_codec = codecs[codecs.size() - 1];
+ // The external codec will appear at last.
+ EXPECT_EQ("GENERIC", external_codec.name);
+ // The internal codec is preferred.
+ EXPECT_GE(internal_codec.preference, external_codec.preference);
+}
+
+// Test that external codec with be ignored if it has the same name as one of
+// the internal codecs.
+TEST_F(WebRtcVideoEngineTestFake, ExternalCodecIgnored) {
+ EXPECT_TRUE(SetupEngine());
+
+ std::vector<cricket::VideoCodec> internal_codecs(engine_.codecs());
+ EXPECT_EQ("VP8", internal_codecs[0].name);
+
+ encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
+ engine_.SetExternalEncoderFactory(&encoder_factory_);
+ encoder_factory_.NotifyCodecsAvailable();
+
+ std::vector<cricket::VideoCodec> codecs = engine_.codecs();
+ EXPECT_EQ("VP8", codecs[0].name);
+ EXPECT_EQ(internal_codecs[0].height, codecs[0].height);
+ EXPECT_EQ(internal_codecs[0].width, codecs[0].width);
+ // Verify the last codec is not the external codec.
+ EXPECT_NE("VP8", codecs[codecs.size() - 1].name);
+}
+
+TEST_F(WebRtcVideoEngineTestFake, UpdateEncoderCodecsAfterSetFactory) {
+ engine_.SetExternalEncoderFactory(&encoder_factory_);
+ EXPECT_TRUE(SetupEngine());
+ int channel_num = vie_.GetLastChannel();
+
+ encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
+ encoder_factory_.NotifyCodecsAvailable();
+ std::vector<cricket::VideoCodec> codecs;
+ codecs.push_back(kVP8Codec);
+ EXPECT_TRUE(channel_->SetSendCodecs(codecs));
+
+ EXPECT_TRUE(channel_->AddSendStream(
+ cricket::StreamParams::CreateLegacy(kSsrc)));
+
+ EXPECT_TRUE(vie_.ExternalEncoderRegistered(channel_num, 100));
+ EXPECT_EQ(1, vie_.GetNumExternalEncoderRegistered(channel_num));
+ EXPECT_EQ(1, encoder_factory_.GetNumCreatedEncoders());
+
+ // Remove stream previously added to free the external encoder instance.
+ EXPECT_TRUE(channel_->RemoveSendStream(kSsrc));
+}
+
+// Tests that OnReadyToSend will be propagated into ViE.
+TEST_F(WebRtcVideoEngineTestFake, OnReadyToSend) {
+ EXPECT_TRUE(SetupEngine());
+ int channel_num = vie_.GetLastChannel();
+ EXPECT_TRUE(vie_.GetIsTransmitting(channel_num));
+
+ channel_->OnReadyToSend(false);
+ EXPECT_FALSE(vie_.GetIsTransmitting(channel_num));
+
+ channel_->OnReadyToSend(true);
+ EXPECT_TRUE(vie_.GetIsTransmitting(channel_num));
+}
+
+#if 0
+TEST_F(WebRtcVideoEngineTestFake, CaptureFrameTimestampToNtpTimestamp) {
+ EXPECT_TRUE(SetupEngine());
+ int capture_id = vie_.GetCaptureId(vie_.GetLastChannel());
+
+ // Set send codec.
+ cricket::VideoCodec codec(kVP8Codec);
+ std::vector<cricket::VideoCodec> codec_list;
+ codec_list.push_back(codec);
+ EXPECT_TRUE(channel_->AddSendStream(
+ cricket::StreamParams::CreateLegacy(123)));
+ EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
+ EXPECT_TRUE(channel_->SetSend(true));
+
+ int64 timestamp = time(NULL) * talk_base::kNumNanosecsPerSec;
+ SendI420ScreencastFrameWithTimestamp(
+ kVP8Codec.width, kVP8Codec.height, timestamp);
+ EXPECT_EQ(talk_base::UnixTimestampNanosecsToNtpMillisecs(timestamp),
+ vie_.GetCaptureLastTimestamp(capture_id));
+
+ SendI420ScreencastFrameWithTimestamp(kVP8Codec.width, kVP8Codec.height, 0);
+ EXPECT_EQ(0, vie_.GetCaptureLastTimestamp(capture_id));
+}
+#endif
+
/////////////////////////
// Tests with real ViE //
/////////////////////////
@@ -1619,6 +1962,10 @@
options.dscp.Set(true);
EXPECT_TRUE(channel_->SetOptions(options));
EXPECT_EQ(talk_base::DSCP_AF41, network_interface->dscp());
+ // Verify previous value is not modified if dscp option is not set.
+ cricket::VideoOptions options1;
+ EXPECT_TRUE(channel_->SetOptions(options1));
+ EXPECT_EQ(talk_base::DSCP_AF41, network_interface->dscp());
options.dscp.Set(false);
EXPECT_TRUE(channel_->SetOptions(options));
EXPECT_EQ(talk_base::DSCP_DEFAULT, network_interface->dscp());
@@ -1697,327 +2044,3 @@
Base::TwoStreamsReUseFirstStream(cricket::VideoCodec(100, "VP8", 640, 400, 30,
0));
}
-
-TEST_F(WebRtcVideoEngineTestFake, ResetCodecOnScreencast) {
- EXPECT_TRUE(SetupEngine());
- cricket::VideoOptions options;
- options.video_noise_reduction.Set(true);
- EXPECT_TRUE(channel_->SetOptions(options));
-
- // Set send codec.
- cricket::VideoCodec codec(kVP8Codec);
- std::vector<cricket::VideoCodec> codec_list;
- codec_list.push_back(codec);
- EXPECT_TRUE(channel_->AddSendStream(
- cricket::StreamParams::CreateLegacy(123)));
- EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
- EXPECT_TRUE(channel_->SetSend(true));
- EXPECT_EQ(1, vie_.num_set_send_codecs());
-
- webrtc::VideoCodec gcodec;
- memset(&gcodec, 0, sizeof(gcodec));
- int channel_num = vie_.GetLastChannel();
- EXPECT_EQ(0, vie_.GetSendCodec(channel_num, gcodec));
- EXPECT_TRUE(gcodec.codecSpecific.VP8.denoisingOn);
-
- // Send a screencast frame with the same size.
- // Verify that denoising is turned off.
- SendI420ScreencastFrame(kVP8Codec.width, kVP8Codec.height);
- EXPECT_EQ(2, vie_.num_set_send_codecs());
- EXPECT_EQ(0, vie_.GetSendCodec(channel_num, gcodec));
- EXPECT_FALSE(gcodec.codecSpecific.VP8.denoisingOn);
-}
-
-
-TEST_F(WebRtcVideoEngineTestFake, DontRegisterDecoderIfFactoryIsNotGiven) {
- engine_.SetExternalDecoderFactory(NULL);
- EXPECT_TRUE(SetupEngine());
- int channel_num = vie_.GetLastChannel();
-
- std::vector<cricket::VideoCodec> codecs;
- codecs.push_back(kVP8Codec);
- EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
-
- EXPECT_EQ(0, vie_.GetNumExternalDecoderRegistered(channel_num));
-}
-
-TEST_F(WebRtcVideoEngineTestFake, RegisterDecoderIfFactoryIsGiven) {
- decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
- engine_.SetExternalDecoderFactory(&decoder_factory_);
- EXPECT_TRUE(SetupEngine());
- int channel_num = vie_.GetLastChannel();
-
- std::vector<cricket::VideoCodec> codecs;
- codecs.push_back(kVP8Codec);
- EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
-
- EXPECT_TRUE(vie_.ExternalDecoderRegistered(channel_num, 100));
- EXPECT_EQ(1, vie_.GetNumExternalDecoderRegistered(channel_num));
-}
-
-TEST_F(WebRtcVideoEngineTestFake, DontRegisterDecoderMultipleTimes) {
- decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
- engine_.SetExternalDecoderFactory(&decoder_factory_);
- EXPECT_TRUE(SetupEngine());
- int channel_num = vie_.GetLastChannel();
-
- std::vector<cricket::VideoCodec> codecs;
- codecs.push_back(kVP8Codec);
- EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
-
- EXPECT_TRUE(vie_.ExternalDecoderRegistered(channel_num, 100));
- EXPECT_EQ(1, vie_.GetNumExternalDecoderRegistered(channel_num));
- EXPECT_EQ(1, decoder_factory_.GetNumCreatedDecoders());
-
- EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
- EXPECT_EQ(1, vie_.GetNumExternalDecoderRegistered(channel_num));
- EXPECT_EQ(1, decoder_factory_.GetNumCreatedDecoders());
-}
-
-TEST_F(WebRtcVideoEngineTestFake, DontRegisterDecoderForNonVP8) {
- decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8);
- engine_.SetExternalDecoderFactory(&decoder_factory_);
- EXPECT_TRUE(SetupEngine());
- int channel_num = vie_.GetLastChannel();
-
- std::vector<cricket::VideoCodec> codecs;
- codecs.push_back(kRedCodec);
- EXPECT_TRUE(channel_->SetRecvCodecs(codecs));
-
- EXPECT_EQ(0, vie_.GetNumExternalDecoderRegistered(channel_num));
-}
-
-TEST_F(WebRtcVideoEngineTestFake, DontRegisterEncoderIfFactoryIsNotGiven) {
- engine_.SetExternalEncoderFactory(NULL);
- EXPECT_TRUE(SetupEngine());
- int channel_num = vie_.GetLastChannel();
-
- std::vector<cricket::VideoCodec> codecs;
- codecs.push_back(kVP8Codec);
- EXPECT_TRUE(channel_->SetSendCodecs(codecs));
-
- EXPECT_EQ(0, vie_.GetNumExternalEncoderRegistered(channel_num));
-}
-
-TEST_F(WebRtcVideoEngineTestFake, RegisterEncoderIfFactoryIsGiven) {
- encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
- engine_.SetExternalEncoderFactory(&encoder_factory_);
- EXPECT_TRUE(SetupEngine());
- int channel_num = vie_.GetLastChannel();
-
- std::vector<cricket::VideoCodec> codecs;
- codecs.push_back(kVP8Codec);
- EXPECT_TRUE(channel_->SetSendCodecs(codecs));
-
- EXPECT_TRUE(channel_->AddSendStream(
- cricket::StreamParams::CreateLegacy(kSsrc)));
-
- EXPECT_TRUE(vie_.ExternalEncoderRegistered(channel_num, 100));
- EXPECT_EQ(1, vie_.GetNumExternalEncoderRegistered(channel_num));
-
- // Remove stream previously added to free the external encoder instance.
- EXPECT_TRUE(channel_->RemoveSendStream(kSsrc));
-}
-
-TEST_F(WebRtcVideoEngineTestFake, DontRegisterEncoderMultipleTimes) {
- encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
- engine_.SetExternalEncoderFactory(&encoder_factory_);
- EXPECT_TRUE(SetupEngine());
- int channel_num = vie_.GetLastChannel();
-
- std::vector<cricket::VideoCodec> codecs;
- codecs.push_back(kVP8Codec);
- EXPECT_TRUE(channel_->SetSendCodecs(codecs));
-
- EXPECT_TRUE(channel_->AddSendStream(
- cricket::StreamParams::CreateLegacy(kSsrc)));
-
- EXPECT_TRUE(vie_.ExternalEncoderRegistered(channel_num, 100));
- EXPECT_EQ(1, vie_.GetNumExternalEncoderRegistered(channel_num));
- EXPECT_EQ(1, encoder_factory_.GetNumCreatedEncoders());
-
- EXPECT_TRUE(channel_->SetSendCodecs(codecs));
- EXPECT_EQ(1, vie_.GetNumExternalEncoderRegistered(channel_num));
- EXPECT_EQ(1, encoder_factory_.GetNumCreatedEncoders());
-
- // Remove stream previously added to free the external encoder instance.
- EXPECT_TRUE(channel_->RemoveSendStream(kSsrc));
-}
-
-TEST_F(WebRtcVideoEngineTestFake, RegisterEncoderWithMultipleSendStreams) {
- encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
- engine_.SetExternalEncoderFactory(&encoder_factory_);
- EXPECT_TRUE(SetupEngine());
-
- std::vector<cricket::VideoCodec> codecs;
- codecs.push_back(kVP8Codec);
- EXPECT_TRUE(channel_->SetSendCodecs(codecs));
- EXPECT_EQ(1, vie_.GetTotalNumExternalEncoderRegistered());
-
- // When we add the first stream (1234), it reuses the default send channel,
- // so it doesn't increase the registration count of external encoders.
- EXPECT_TRUE(channel_->AddSendStream(
- cricket::StreamParams::CreateLegacy(1234)));
- EXPECT_EQ(1, vie_.GetTotalNumExternalEncoderRegistered());
-
- // When we add the second stream (2345), it creates a new channel and
- // increments the registration count.
- EXPECT_TRUE(channel_->AddSendStream(
- cricket::StreamParams::CreateLegacy(2345)));
- EXPECT_EQ(2, vie_.GetTotalNumExternalEncoderRegistered());
-
- // At this moment the total registration count is two, but only one encoder
- // is registered per channel.
- int channel_num = vie_.GetLastChannel();
- EXPECT_EQ(1, vie_.GetNumExternalEncoderRegistered(channel_num));
-
- // Removing send streams decrements the registration count.
- EXPECT_TRUE(channel_->RemoveSendStream(1234));
- EXPECT_EQ(1, vie_.GetTotalNumExternalEncoderRegistered());
-
- // When we remove the last send stream, it also destroys the last send
- // channel and causes the registration count to drop to zero. It is a little
- // weird, but not a bug.
- EXPECT_TRUE(channel_->RemoveSendStream(2345));
- EXPECT_EQ(0, vie_.GetTotalNumExternalEncoderRegistered());
-}
-
-TEST_F(WebRtcVideoEngineTestFake, DontRegisterEncoderForNonVP8) {
- encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecGeneric,
- "GENERIC");
- engine_.SetExternalEncoderFactory(&encoder_factory_);
- EXPECT_TRUE(SetupEngine());
- int channel_num = vie_.GetLastChannel();
-
- // Note: unlike the SetRecvCodecs, we must set a valid video codec for
- // channel_->SetSendCodecs() to succeed.
- std::vector<cricket::VideoCodec> codecs;
- codecs.push_back(kVP8Codec);
- EXPECT_TRUE(channel_->SetSendCodecs(codecs));
-
- EXPECT_EQ(0, vie_.GetNumExternalEncoderRegistered(channel_num));
-}
-
-// Test that NACK and REMB are enabled for external codec.
-TEST_F(WebRtcVideoEngineTestFake, FeedbackParamsForNonVP8) {
- encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecGeneric,
- "GENERIC");
- engine_.SetExternalEncoderFactory(&encoder_factory_);
- encoder_factory_.NotifyCodecsAvailable();
- EXPECT_TRUE(SetupEngine());
-
- std::vector<cricket::VideoCodec> codecs(engine_.codecs());
- // The external codec will appear at last.
- size_t pos = codecs.size() - 1;
- EXPECT_EQ("GENERIC", codecs[pos].name);
- EXPECT_TRUE(codecs[pos].HasFeedbackParam(
- cricket::FeedbackParam(cricket::kRtcpFbParamNack,
- cricket::kParamValueEmpty)));
- EXPECT_TRUE(codecs[pos].HasFeedbackParam(
- cricket::FeedbackParam(cricket::kRtcpFbParamRemb,
- cricket::kParamValueEmpty)));
- EXPECT_TRUE(codecs[pos].HasFeedbackParam(
- cricket::FeedbackParam(cricket::kRtcpFbParamCcm,
- cricket::kRtcpFbCcmParamFir)));
-}
-
-// Test external codec with be added to the end of the supported codec list.
-TEST_F(WebRtcVideoEngineTestFake, ExternalCodecAddedToTheEnd) {
- EXPECT_TRUE(SetupEngine());
-
- std::vector<cricket::VideoCodec> codecs(engine_.codecs());
- EXPECT_EQ("VP8", codecs[0].name);
-
- encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecGeneric,
- "GENERIC");
- engine_.SetExternalEncoderFactory(&encoder_factory_);
- encoder_factory_.NotifyCodecsAvailable();
-
- codecs = engine_.codecs();
- cricket::VideoCodec internal_codec = codecs[0];
- cricket::VideoCodec external_codec = codecs[codecs.size() - 1];
- // The external codec will appear at last.
- EXPECT_EQ("GENERIC", external_codec.name);
- // The internal codec is preferred.
- EXPECT_GE(internal_codec.preference, external_codec.preference);
-}
-
-// Test that external codec with be ignored if it has the same name as one of
-// the internal codecs.
-TEST_F(WebRtcVideoEngineTestFake, ExternalCodecIgnored) {
- EXPECT_TRUE(SetupEngine());
-
- std::vector<cricket::VideoCodec> internal_codecs(engine_.codecs());
- EXPECT_EQ("VP8", internal_codecs[0].name);
-
- encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
- engine_.SetExternalEncoderFactory(&encoder_factory_);
- encoder_factory_.NotifyCodecsAvailable();
-
- std::vector<cricket::VideoCodec> codecs = engine_.codecs();
- EXPECT_EQ("VP8", codecs[0].name);
- EXPECT_EQ(internal_codecs[0].height, codecs[0].height);
- EXPECT_EQ(internal_codecs[0].width, codecs[0].width);
- // Verify the last codec is not the external codec.
- EXPECT_NE("VP8", codecs[codecs.size() - 1].name);
-}
-
-TEST_F(WebRtcVideoEngineTestFake, UpdateEncoderCodecsAfterSetFactory) {
- engine_.SetExternalEncoderFactory(&encoder_factory_);
- EXPECT_TRUE(SetupEngine());
- int channel_num = vie_.GetLastChannel();
-
- encoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8, "VP8");
- encoder_factory_.NotifyCodecsAvailable();
- std::vector<cricket::VideoCodec> codecs;
- codecs.push_back(kVP8Codec);
- EXPECT_TRUE(channel_->SetSendCodecs(codecs));
-
- EXPECT_TRUE(channel_->AddSendStream(
- cricket::StreamParams::CreateLegacy(kSsrc)));
-
- EXPECT_TRUE(vie_.ExternalEncoderRegistered(channel_num, 100));
- EXPECT_EQ(1, vie_.GetNumExternalEncoderRegistered(channel_num));
- EXPECT_EQ(1, encoder_factory_.GetNumCreatedEncoders());
-
- // Remove stream previously added to free the external encoder instance.
- EXPECT_TRUE(channel_->RemoveSendStream(kSsrc));
-}
-
-// Tests that OnReadyToSend will be propagated into ViE.
-TEST_F(WebRtcVideoEngineTestFake, OnReadyToSend) {
- EXPECT_TRUE(SetupEngine());
- int channel_num = vie_.GetLastChannel();
- EXPECT_TRUE(vie_.GetIsTransmitting(channel_num));
-
- channel_->OnReadyToSend(false);
- EXPECT_FALSE(vie_.GetIsTransmitting(channel_num));
-
- channel_->OnReadyToSend(true);
- EXPECT_TRUE(vie_.GetIsTransmitting(channel_num));
-}
-
-#if 0
-TEST_F(WebRtcVideoEngineTestFake, CaptureFrameTimestampToNtpTimestamp) {
- EXPECT_TRUE(SetupEngine());
- int capture_id = vie_.GetCaptureId(vie_.GetLastChannel());
-
- // Set send codec.
- cricket::VideoCodec codec(kVP8Codec);
- std::vector<cricket::VideoCodec> codec_list;
- codec_list.push_back(codec);
- EXPECT_TRUE(channel_->AddSendStream(
- cricket::StreamParams::CreateLegacy(123)));
- EXPECT_TRUE(channel_->SetSendCodecs(codec_list));
- EXPECT_TRUE(channel_->SetSend(true));
-
- int64 timestamp = time(NULL) * talk_base::kNumNanosecsPerSec;
- SendI420ScreencastFrameWithTimestamp(
- kVP8Codec.width, kVP8Codec.height, timestamp);
- EXPECT_EQ(talk_base::UnixTimestampNanosecsToNtpMillisecs(timestamp),
- vie_.GetCaptureLastTimestamp(capture_id));
-
- SendI420ScreencastFrameWithTimestamp(kVP8Codec.width, kVP8Codec.height, 0);
- EXPECT_EQ(0, vie_.GetCaptureLastTimestamp(capture_id));
-}
-#endif