Support VP8 encoder settings in VideoSendStream.
Stop-gap solution to support VP8 codec settings in the new API until
encoder settings can be passed on to the VideoEncoder without requiring
explicit support for the codec.
BUG=3424
R=stefan@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/17929004
git-svn-id: http://webrtc.googlecode.com/svn/trunk@6650 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/webrtc/test/call_test.cc b/webrtc/test/call_test.cc
index 16dad71..d683ff2 100644
--- a/webrtc/test/call_test.cc
+++ b/webrtc/test/call_test.cc
@@ -16,6 +16,7 @@
CallTest::CallTest()
: clock_(Clock::GetRealTimeClock()),
+ encoder_settings_(NULL),
send_stream_(NULL),
fake_encoder_(clock_) {
}
@@ -39,6 +40,7 @@
if (test->ShouldCreateReceivers()) {
CreateMatchingReceiveConfigs();
}
+ encoder_settings_ = test->GetEncoderSettings();
test->ModifyConfigs(&send_config_, &receive_configs_, &video_streams_);
CreateStreams();
test->OnStreamsCreated(send_stream_, receive_streams_);
@@ -128,8 +130,8 @@
assert(send_stream_ == NULL);
assert(receive_streams_.empty());
- send_stream_ =
- sender_call_->CreateVideoSendStream(send_config_, video_streams_, NULL);
+ send_stream_ = sender_call_->CreateVideoSendStream(
+ send_config_, video_streams_, encoder_settings_);
for (size_t i = 0; i < receive_configs_.size(); ++i) {
receive_streams_.push_back(
@@ -183,6 +185,10 @@
return 1;
}
+const void* BaseTest::GetEncoderSettings() {
+ return NULL;
+}
+
void BaseTest::ModifyConfigs(
VideoSendStream::Config* send_config,
std::vector<VideoReceiveStream::Config>* receive_configs,
diff --git a/webrtc/test/call_test.h b/webrtc/test/call_test.h
index e24d835..f9baf1e 100644
--- a/webrtc/test/call_test.h
+++ b/webrtc/test/call_test.h
@@ -63,6 +63,7 @@
scoped_ptr<Call> sender_call_;
VideoSendStream::Config send_config_;
std::vector<VideoStream> video_streams_;
+ const void* encoder_settings_;
VideoSendStream* send_stream_;
scoped_ptr<Call> receiver_call_;
@@ -89,6 +90,7 @@
virtual Call::Config GetReceiverCallConfig();
virtual void OnCallsCreated(Call* sender_call, Call* receiver_call);
+ virtual const void* GetEncoderSettings();
virtual void ModifyConfigs(
VideoSendStream::Config* send_config,
std::vector<VideoReceiveStream::Config>* receive_configs,
diff --git a/webrtc/video/video_send_stream.cc b/webrtc/video/video_send_stream.cc
index ff3fe50..be3fa5c 100644
--- a/webrtc/video/video_send_stream.cc
+++ b/webrtc/video/video_send_stream.cc
@@ -298,8 +298,6 @@
const void* encoder_settings) {
assert(!streams.empty());
assert(config_.rtp.ssrcs.size() >= streams.size());
- // TODO(pbos): Wire encoder_settings.
- assert(encoder_settings == NULL);
VideoCodec video_codec;
memset(&video_codec, 0, sizeof(video_codec));
@@ -317,6 +315,16 @@
video_codec.codecSpecific.VP8.keyFrameInterval = 3000;
}
+ if (video_codec.codecType == kVideoCodecVP8) {
+ if (encoder_settings != NULL) {
+ video_codec.codecSpecific.VP8 =
+ *reinterpret_cast<const VideoCodecVP8*>(encoder_settings);
+ }
+ } else {
+ // TODO(pbos): Support encoder_settings codec-agnostically.
+ assert(encoder_settings == NULL);
+ }
+
strncpy(video_codec.plName,
config_.encoder_settings.payload_name.c_str(),
kPayloadNameSize - 1);
diff --git a/webrtc/video/video_send_stream_tests.cc b/webrtc/video/video_send_stream_tests.cc
index 08c4faf..bb9d7fa 100644
--- a/webrtc/video/video_send_stream_tests.cc
+++ b/webrtc/video/video_send_stream_tests.cc
@@ -1369,4 +1369,65 @@
EXPECT_EQ(1u, test_encoder.num_releases());
}
+TEST_F(VideoSendStreamTest, EncoderSetupPropagatesVp8Config) {
+ class VideoCodecConfigObserver : public test::SendTest,
+ public test::FakeEncoder {
+ public:
+ VideoCodecConfigObserver()
+ : SendTest(kDefaultTimeoutMs),
+ FakeEncoder(Clock::GetRealTimeClock()),
+ num_initializations_(0) {
+ memset(&vp8_settings_, 0, sizeof(vp8_settings_));
+ }
+
+ private:
+ virtual void ModifyConfigs(
+ VideoSendStream::Config* send_config,
+ std::vector<VideoReceiveStream::Config>* receive_configs,
+ std::vector<VideoStream>* video_streams) OVERRIDE {
+ send_config->encoder_settings.encoder = this;
+ send_config->encoder_settings.payload_name = "VP8";
+
+ video_streams_ = *video_streams;
+ }
+
+ virtual void OnStreamsCreated(
+ VideoSendStream* send_stream,
+ const std::vector<VideoReceiveStream*>& receive_streams) OVERRIDE {
+ stream_ = send_stream;
+ }
+
+ virtual int32_t InitEncode(const VideoCodec* config,
+ int32_t number_of_cores,
+ uint32_t max_payload_size) OVERRIDE {
+ EXPECT_EQ(kVideoCodecVP8, config->codecType);
+ EXPECT_EQ(0,
+ memcmp(&config->codecSpecific.VP8,
+ &vp8_settings_,
+ sizeof(vp8_settings_)));
+ ++num_initializations_;
+ return FakeEncoder::InitEncode(config, number_of_cores, max_payload_size);
+ }
+
+ virtual void PerformTest() OVERRIDE {
+ EXPECT_EQ(1u, num_initializations_) << "VideoEncoder not initialized.";
+
+ vp8_settings_.denoisingOn = true;
+ stream_->ReconfigureVideoEncoder(video_streams_, &vp8_settings_);
+ EXPECT_EQ(2u, num_initializations_)
+ << "ReconfigureVideoEncoder did not reinitialize the encoder with "
+ "new encoder settings.";
+ }
+
+ virtual const void* GetEncoderSettings() OVERRIDE { return &vp8_settings_; }
+
+ VideoCodecVP8 vp8_settings_;
+ size_t num_initializations_;
+ VideoSendStream* stream_;
+ std::vector<VideoStream> video_streams_;
+ } test;
+
+ RunBaseTest(&test);
+}
+
} // namespace webrtc