Implement screencast settings for WebRtcVideoEngine2.

Adds support for screencast_min_bitrate and sets content type
corresponding to the capture type.

R=stefan@webrtc.org
BUG=1788

Review URL: https://webrtc-codereview.appspot.com/29959004

git-svn-id: http://webrtc.googlecode.com/svn/trunk@7529 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/talk/media/webrtc/webrtcvideoengine2_unittest.cc b/talk/media/webrtc/webrtcvideoengine2_unittest.cc
index 1556732..29c7dd5 100644
--- a/talk/media/webrtc/webrtcvideoengine2_unittest.cc
+++ b/talk/media/webrtc/webrtcvideoengine2_unittest.cc
@@ -79,10 +79,14 @@
   ReconfigureVideoEncoder(encoder_config);
 }
 
-webrtc::VideoSendStream::Config FakeVideoSendStream::GetConfig() {
+webrtc::VideoSendStream::Config FakeVideoSendStream::GetConfig() const {
   return config_;
 }
 
+webrtc::VideoEncoderConfig FakeVideoSendStream::GetEncoderConfig() const {
+  return encoder_config_;
+}
+
 std::vector<webrtc::VideoStream> FakeVideoSendStream::GetVideoStreams() {
   return encoder_config_.streams;
 }
@@ -725,7 +729,7 @@
   EXPECT_TRUE(channel_->SetCapturer(kSsrc, video_capturer_.get()));
 
   // Capture format HD -> adapt (OnOutputFormatRequest VGA) -> VGA.
-  cricket::VideoCodec codec(100, "VP8", 1280, 720, 30, 0);
+  cricket::VideoCodec codec = kVp8Codec720p;
   EXPECT_TRUE(SetOneCodec(codec));
   codec.width /= 2;
   codec.height /= 2;
@@ -1189,8 +1193,60 @@
   FAIL() << "Not implemented.";  // TODO(pbos): Implement.
 }
 
-TEST_F(WebRtcVideoChannel2Test, DISABLED_SetBandwidthScreencast) {
-  FAIL() << "Not implemented.";  // TODO(pbos): Implement.
+TEST_F(WebRtcVideoChannel2Test, UsesCorrectSettingsForScreencast) {
+  static const int kScreenshareMinBitrateKbps = 800;
+  cricket::VideoCodec codec = kVp8Codec360p;
+  std::vector<cricket::VideoCodec> codecs;
+  codecs.push_back(codec);
+  EXPECT_TRUE(channel_->SetSendCodecs(codecs));
+  VideoOptions options;
+  options.screencast_min_bitrate.Set(kScreenshareMinBitrateKbps);
+  channel_->SetOptions(options);
+
+  AddSendStream();
+
+  cricket::FakeVideoCapturer capturer;
+  capturer.SetScreencast(false);
+  EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, &capturer));
+  cricket::VideoFormat capture_format_hd =
+      capturer.GetSupportedFormats()->front();
+  EXPECT_EQ(1280, capture_format_hd.width);
+  EXPECT_EQ(720, capture_format_hd.height);
+  EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capture_format_hd));
+
+  EXPECT_TRUE(channel_->SetSend(true));
+
+  EXPECT_TRUE(capturer.CaptureFrame());
+  ASSERT_EQ(1u, fake_call_->GetVideoSendStreams().size());
+  FakeVideoSendStream* send_stream = fake_call_->GetVideoSendStreams().front();
+
+  EXPECT_EQ(1, send_stream->GetNumberOfSwappedFrames());
+
+  // Verify non-screencast settings.
+  webrtc::VideoEncoderConfig encoder_config = send_stream->GetEncoderConfig();
+  EXPECT_EQ(webrtc::VideoEncoderConfig::kRealtimeVideo,
+            encoder_config.content_type);
+  EXPECT_EQ(codec.width, encoder_config.streams.front().width);
+  EXPECT_EQ(codec.height, encoder_config.streams.front().height);
+  EXPECT_EQ(0, encoder_config.min_transmit_bitrate_bps)
+      << "Non-screenshare shouldn't use min-transmit bitrate.";
+
+  capturer.SetScreencast(true);
+  EXPECT_TRUE(capturer.CaptureFrame());
+
+  EXPECT_EQ(2, send_stream->GetNumberOfSwappedFrames());
+
+  // Verify screencast settings.
+  encoder_config = send_stream->GetEncoderConfig();
+  EXPECT_EQ(webrtc::VideoEncoderConfig::kScreenshare,
+            encoder_config.content_type);
+  EXPECT_EQ(kScreenshareMinBitrateKbps * 1000,
+            encoder_config.min_transmit_bitrate_bps);
+
+  EXPECT_EQ(capture_format_hd.width, encoder_config.streams.front().width);
+  EXPECT_EQ(capture_format_hd.height, encoder_config.streams.front().height);
+
+  EXPECT_TRUE(channel_->SetCapturer(last_ssrc_, NULL));
 }
 
 TEST_F(WebRtcVideoChannel2Test, DISABLED_SetSendSsrcAndCname) {
@@ -1290,7 +1346,7 @@
 }
 
 void WebRtcVideoChannel2Test::TestCpuAdaptation(bool enable_overuse) {
-  cricket::VideoCodec codec(100, "VP8", 1280, 720, 30, 0);
+  cricket::VideoCodec codec = kVp8Codec720p;
   std::vector<cricket::VideoCodec> codecs;
   codecs.push_back(codec);
   EXPECT_TRUE(channel_->SetSendCodecs(codecs));