From 32ec0dd0322f2b81313d08c1998073d60678eebd Mon Sep 17 00:00:00 2001 From: "buildbot@webrtc.org" Date: Mon, 1 Dec 2014 17:57:36 +0000 Subject: [PATCH] (Auto)update libjingle 81063831-> 81073932 git-svn-id: http://webrtc.googlecode.com/svn/trunk@7774 4adac7df-926f-26a2-2b94-8c16560cd09d --- talk/media/webrtc/webrtcvideoengine.cc | 34 +++++++++++++------ .../webrtc/webrtcvideoengine_unittest.cc | 30 ++++++++++++++++ 2 files changed, 54 insertions(+), 10 deletions(-) diff --git a/talk/media/webrtc/webrtcvideoengine.cc b/talk/media/webrtc/webrtcvideoengine.cc index 3bcec4de48..0926b071aa 100644 --- a/talk/media/webrtc/webrtcvideoengine.cc +++ b/talk/media/webrtc/webrtcvideoengine.cc @@ -3216,6 +3216,10 @@ bool WebRtcVideoMediaChannel::SendFrame( if (!send_channel) { return false; } + + bool changed; + send_channel->SetLastCapturedFrameInfo(frame, is_screencast, &changed); + if (!send_codec_) { // Send codec has not been set. No reason to process the frame any further. return false; @@ -3229,8 +3233,6 @@ bool WebRtcVideoMediaChannel::SendFrame( return true; } - bool changed; - send_channel->SetLastCapturedFrameInfo(frame, is_screencast, &changed); if (changed) { // If the last captured frame info changed, then calling // SetSendParams will update to the latest resolution. @@ -3877,20 +3879,32 @@ bool WebRtcVideoMediaChannel::SetSendParams( MaybeRegisterExternalEncoder(send_channel, send_params.codec); CapturedFrameInfo frame; - send_channel->last_captured_frame_info().Get(&frame); + if (!send_channel->last_captured_frame_info().Get(&frame)) { + // When we don't have a frame yet, configure the encoder with a + // 2x2 frame (the smallest possible I420 frame). This gives us + // low memory usage but also makes it so configuration errors are + // discovered at the time we apply the settings rather than when + // we get the first frame (waiting for the first frame to know + // that you gave a bad codec parameter could make debugging hard). + frame.width = 2; + frame.height = 2; + + // TODO(pthatcher): Evaluate the risk of not setting up an encoder + // at all until we have a frame. Once we feel it's worth the + // risk, we can do something like this: + // send_channel->set_send_params(send_params); + // return true; + } // TODO(pthatcher): This checking of the max height and width is // only needed because some unit tests bypass the VideoAdapter, and // others expect behavior from the adapter different than what it // actually does. We should fix the tests and remove this block. VideoFormat max = send_channel->adapt_format(); - size_t max_width = static_cast(max.width); - size_t max_height = static_cast(max.height); - if (!send_channel->last_captured_frame_info().IsSet() || - (!frame.screencast && - (frame.width > max_width || frame.height > max_height))) { - frame.width = max_width; - frame.height = max_height; + if ((!frame.screencast && + (frame.width > max.width || frame.height > max.height))) { + frame.width = max.width; + frame.height = max.height; } webrtc::VideoCodec codec; diff --git a/talk/media/webrtc/webrtcvideoengine_unittest.cc b/talk/media/webrtc/webrtcvideoengine_unittest.cc index 00d6e4b1ed..5dcba8e3aa 100644 --- a/talk/media/webrtc/webrtcvideoengine_unittest.cc +++ b/talk/media/webrtc/webrtcvideoengine_unittest.cc @@ -371,6 +371,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetSendCodecs) { EXPECT_TRUE(SetupEngine()); int channel_num = vie_.GetLastChannel(); std::vector codecs(engine_.codecs()); + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(codecs)); VerifyVP8SendCodec(channel_num, kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(vie_.GetHybridNackFecStatus(channel_num)); @@ -379,12 +380,21 @@ TEST_F(WebRtcVideoEngineTestFake, SetSendCodecs) { // TODO(juberti): Check RTCP, PLI, TMMBR. } +TEST_F(WebRtcVideoEngineTestFake, SetSendCodecsBeforeFrameRegistersTinyFormat) { + EXPECT_TRUE(SetupEngine()); + int channel_num = vie_.GetLastChannel(); + std::vector codecs(engine_.codecs()); + EXPECT_TRUE(channel_->SetSendCodecs(codecs)); + VerifyVP8SendCodec(channel_num, 2, 2); +} + // Test that ViE Channel doesn't call SetSendCodec again if same codec is tried // to apply. TEST_F(WebRtcVideoEngineTestFake, DontResetSetSendCodec) { EXPECT_TRUE(SetupEngine()); int channel_num = vie_.GetLastChannel(); std::vector codecs(engine_.codecs()); + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(codecs)); VerifyVP8SendCodec(channel_num, kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(vie_.GetHybridNackFecStatus(channel_num)); @@ -403,6 +413,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetSendCodecsWithMinMaxBitrate) { std::vector codecs(engine_.codecs()); codecs[0].params[cricket::kCodecParamMinBitrate] = "10"; codecs[0].params[cricket::kCodecParamMaxBitrate] = "20"; + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(codecs)); VerifyVP8SendCodec( @@ -419,6 +430,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetSendCodecsWithStartBitrate) { int channel_num = vie_.GetLastChannel(); std::vector codecs(engine_.codecs()); codecs[0].params[cricket::kCodecParamStartBitrate] = "450"; + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(codecs)); VerifyVP8SendCodec(channel_num, @@ -441,6 +453,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetSendCodecsWithMinMaxStartBitrate) { codecs[0].params[cricket::kCodecParamMinBitrate] = "10"; codecs[0].params[cricket::kCodecParamMaxBitrate] = "20"; codecs[0].params[cricket::kCodecParamStartBitrate] = "14"; + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(codecs)); VerifyVP8SendCodec( @@ -458,6 +471,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetSendCodecsWithMinMaxBitrateInvalid) { std::vector codecs(engine_.codecs()); codecs[0].params[cricket::kCodecParamMinBitrate] = "30"; codecs[0].params[cricket::kCodecParamMaxBitrate] = "20"; + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_FALSE(channel_->SetSendCodecs(codecs)); } @@ -467,6 +481,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetSendCodecsWithLargeMinMaxBitrate) { std::vector codecs(engine_.codecs()); codecs[0].params[cricket::kCodecParamMinBitrate] = "1000"; codecs[0].params[cricket::kCodecParamMaxBitrate] = "3000"; + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(codecs)); VerifyVP8SendCodec( @@ -479,6 +494,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetSendCodecsWithMaxQuantization) { int channel_num = vie_.GetLastChannel(); std::vector codecs(engine_.codecs()); codecs[0].params[cricket::kCodecParamMaxQuantization] = "21"; + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(codecs)); VerifyVP8SendCodec(channel_num, @@ -502,6 +518,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetOptionsWithMaxBitrate) { std::vector codecs(engine_.codecs()); codecs[0].params[cricket::kCodecParamMinBitrate] = "10"; codecs[0].params[cricket::kCodecParamMaxBitrate] = "20"; + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(codecs)); VerifyVP8SendCodec( @@ -527,6 +544,7 @@ TEST_F(WebRtcVideoEngineTestFake, MaxBitrateResetWithConferenceMode) { std::vector codecs(engine_.codecs()); codecs[0].params[cricket::kCodecParamMinBitrate] = "10"; codecs[0].params[cricket::kCodecParamMaxBitrate] = "20"; + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(codecs)); VerifyVP8SendCodec( @@ -552,6 +570,7 @@ TEST_F(WebRtcVideoEngineTestFake, StartSendBitrate) { cricket::VideoCodec codec(kVP8Codec); std::vector codec_list; codec_list.push_back(codec); + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(codec_list)); VerifyVP8SendCodec(send_channel, kVP8Codec.width, kVP8Codec.height, 0, kMaxBandwidthKbps, kMinBandwidthKbps, @@ -601,6 +620,7 @@ TEST_F(WebRtcVideoEngineTestFake, ConstrainSendCodecs) { codec_list.push_back(codec); // Set send codec and verify codec has been constrained. + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(codec_list)); VerifyVP8SendCodec(channel_num, kVP8Codec.width, kVP8Codec.height); } @@ -617,6 +637,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetSendCodecsRejectBadFormat) { codec_list.push_back(codec); // Verify SetSendCodecs failed and send codec is not changed on engine. + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_FALSE(channel_->SetSendCodecs(codec_list)); webrtc::VideoCodec gcodec; // Set plType to something other than the value to test against ensuring @@ -650,6 +671,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetSendCodecsRejectBadCodec) { codec_list.push_back(codec); // Verify SetSendCodecs failed and send codec is not changed on engine. + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_FALSE(channel_->SetSendCodecs(codec_list)); webrtc::VideoCodec gcodec; // Set plType to something other than the value to test against ensuring @@ -667,6 +689,7 @@ TEST_F(WebRtcVideoEngineTestFake, ResetVieSendCodecOnNewFrameSize) { // Set send codec. std::vector codec_list; codec_list.push_back(kVP8Codec); + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(codec_list)); EXPECT_TRUE(channel_->AddSendStream( cricket::StreamParams::CreateLegacy(123))); @@ -1019,6 +1042,7 @@ TEST_F(WebRtcVideoEngineTestFake, BufferedModeLatency) { TEST_F(WebRtcVideoEngineTestFake, AdditiveVideoOptions) { EXPECT_TRUE(SetupEngine()); EXPECT_TRUE(channel_->AddSendStream(cricket::StreamParams::CreateLegacy(1))); + SendI420Frame(kVP8Codec.width, kVP8Codec.height); channel_->SetSendCodecs(engine_.codecs()); int first_send_channel = vie_.GetLastChannel(); @@ -1428,6 +1452,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetSend) { TEST_F(WebRtcVideoEngineTestFake, SetBandwidthAuto) { EXPECT_TRUE(SetupEngine()); int channel_num = vie_.GetLastChannel(); + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs())); EXPECT_TRUE(channel_->SetMaxSendBandwidth(cricket::kAutoBandwidth)); VerifyVP8SendCodec(channel_num, kVP8Codec.width, kVP8Codec.height); @@ -1437,6 +1462,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetBandwidthAuto) { TEST_F(WebRtcVideoEngineTestFake, SetBandwidthCapped) { EXPECT_TRUE(SetupEngine()); int channel_num = vie_.GetLastChannel(); + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs())); EXPECT_TRUE(channel_->SetMaxSendBandwidth(768000)); VerifyVP8SendCodec(channel_num, kVP8Codec.width, kVP8Codec.height, 0, 768U); @@ -1447,6 +1473,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetBandwidthCapped) { TEST_F(WebRtcVideoEngineTestFake, SetMaxBandwidthBelowDefaultStart) { EXPECT_TRUE(SetupEngine()); int channel_num = vie_.GetLastChannel(); + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs())); int max_bandwidth_kbps = (kMinBandwidthKbps + kStartBandwidthKbps) / 2; EXPECT_TRUE(channel_->SetMaxSendBandwidth(max_bandwidth_kbps * 1000)); @@ -1459,6 +1486,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetMaxBandwidthBelowDefaultStart) { TEST_F(WebRtcVideoEngineTestFake, SetMaxBandwidthBelowMin) { EXPECT_TRUE(SetupEngine()); int channel_num = vie_.GetLastChannel(); + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs())); int max_bandwidth_kbps = kMinBandwidthKbps / 2; EXPECT_TRUE(channel_->SetMaxSendBandwidth(max_bandwidth_kbps * 1000)); @@ -1471,6 +1499,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetStartBandwidthOption) { EXPECT_TRUE(SetupEngine()); int channel_num = vie_.GetLastChannel(); EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs())); + SendI420Frame(kVP8Codec.width, kVP8Codec.height); VerifyVP8SendCodec(channel_num, kVP8Codec.width, kVP8Codec.height, 0, kMaxBandwidthKbps, kMinBandwidthKbps, kStartBandwidthKbps); @@ -1493,6 +1522,7 @@ TEST_F(WebRtcVideoEngineTestFake, SetBandwidthInConference) { cricket::VideoOptions options; options.conference_mode.Set(true); EXPECT_TRUE(channel_->SetOptions(options)); + SendI420Frame(kVP8Codec.width, kVP8Codec.height); EXPECT_TRUE(channel_->SetSendCodecs(engine_.codecs())); VerifyVP8SendCodec(channel_num, kVP8Codec.width, kVP8Codec.height);