Let ViEEncoder handle resolution changes.
This cl move codec reconfiguration due to video frame size changes from WebRtcVideoSendStream to ViEEncoder. With this change, many variables in WebRtcVideoSendStream no longer need to be locked. BUG=webrtc:5687, webrtc:6371, webrtc:5332 Review-Url: https://codereview.webrtc.org/2351633002 Cr-Commit-Position: refs/heads/master@{#14445}
This commit is contained in:
@ -264,7 +264,9 @@ void CallPerfTest::TestAudioVideoSync(FecMode fec,
|
||||
EXPECT_EQ(1u, video_receive_streams_.size());
|
||||
observer.set_receive_stream(video_receive_streams_[0]);
|
||||
DriftingClock drifting_clock(clock_, video_ntp_speed);
|
||||
CreateFrameGeneratorCapturerWithDrift(&drifting_clock, video_rtp_speed);
|
||||
CreateFrameGeneratorCapturerWithDrift(&drifting_clock, video_rtp_speed,
|
||||
kDefaultFramerate, kDefaultWidth,
|
||||
kDefaultHeight);
|
||||
|
||||
Start();
|
||||
|
||||
@ -618,6 +620,24 @@ TEST_F(CallPerfTest, KeepsHighBitrateWhenReconfiguringSender) {
|
||||
static const uint32_t kReconfigureThresholdKbps = 600;
|
||||
static const uint32_t kPermittedReconfiguredBitrateDiffKbps = 100;
|
||||
|
||||
class VideoStreamFactory
|
||||
: public VideoEncoderConfig::VideoStreamFactoryInterface {
|
||||
public:
|
||||
VideoStreamFactory() {}
|
||||
|
||||
private:
|
||||
std::vector<VideoStream> CreateEncoderStreams(
|
||||
int width,
|
||||
int height,
|
||||
const VideoEncoderConfig& encoder_config) override {
|
||||
std::vector<VideoStream> streams =
|
||||
test::CreateVideoStreams(width, height, encoder_config);
|
||||
streams[0].min_bitrate_bps = 50000;
|
||||
streams[0].target_bitrate_bps = streams[0].max_bitrate_bps = 2000000;
|
||||
return streams;
|
||||
}
|
||||
};
|
||||
|
||||
class BitrateObserver : public test::EndToEndTest, public test::FakeEncoder {
|
||||
public:
|
||||
BitrateObserver()
|
||||
@ -631,12 +651,18 @@ TEST_F(CallPerfTest, KeepsHighBitrateWhenReconfiguringSender) {
|
||||
int32_t InitEncode(const VideoCodec* config,
|
||||
int32_t number_of_cores,
|
||||
size_t max_payload_size) override {
|
||||
if (encoder_inits_ == 0) {
|
||||
++encoder_inits_;
|
||||
if (encoder_inits_ == 1) {
|
||||
// First time initialization. Frame size is not known.
|
||||
EXPECT_EQ(kInitialBitrateKbps, config->startBitrate)
|
||||
<< "Encoder not initialized at expected bitrate.";
|
||||
}
|
||||
++encoder_inits_;
|
||||
if (encoder_inits_ == 2) {
|
||||
} else if (encoder_inits_ == 2) {
|
||||
// First time initialization. Frame size is known.
|
||||
EXPECT_EQ(kDefaultWidth, config->width);
|
||||
EXPECT_EQ(kDefaultHeight, config->height);
|
||||
} else if (encoder_inits_ == 3) {
|
||||
EXPECT_EQ(2 * kDefaultWidth, config->width);
|
||||
EXPECT_EQ(2 * kDefaultHeight, config->height);
|
||||
EXPECT_GE(last_set_bitrate_, kReconfigureThresholdKbps);
|
||||
EXPECT_NEAR(config->startBitrate,
|
||||
last_set_bitrate_,
|
||||
@ -650,7 +676,7 @@ TEST_F(CallPerfTest, KeepsHighBitrateWhenReconfiguringSender) {
|
||||
int32_t SetRates(uint32_t new_target_bitrate_kbps,
|
||||
uint32_t framerate) override {
|
||||
last_set_bitrate_ = new_target_bitrate_kbps;
|
||||
if (encoder_inits_ == 1 &&
|
||||
if (encoder_inits_ == 2 &&
|
||||
new_target_bitrate_kbps > kReconfigureThresholdKbps) {
|
||||
time_to_reconfigure_.Set();
|
||||
}
|
||||
@ -668,9 +694,8 @@ TEST_F(CallPerfTest, KeepsHighBitrateWhenReconfiguringSender) {
|
||||
std::vector<VideoReceiveStream::Config>* receive_configs,
|
||||
VideoEncoderConfig* encoder_config) override {
|
||||
send_config->encoder_settings.encoder = this;
|
||||
encoder_config->streams[0].min_bitrate_bps = 50000;
|
||||
encoder_config->streams[0].target_bitrate_bps =
|
||||
encoder_config->streams[0].max_bitrate_bps = 2000000;
|
||||
encoder_config->video_stream_factory =
|
||||
new rtc::RefCountedObject<VideoStreamFactory>();
|
||||
|
||||
encoder_config_ = encoder_config->Copy();
|
||||
}
|
||||
@ -681,11 +706,15 @@ TEST_F(CallPerfTest, KeepsHighBitrateWhenReconfiguringSender) {
|
||||
send_stream_ = send_stream;
|
||||
}
|
||||
|
||||
void OnFrameGeneratorCapturerCreated(
|
||||
test::FrameGeneratorCapturer* frame_generator_capturer) override {
|
||||
frame_generator_ = frame_generator_capturer;
|
||||
}
|
||||
|
||||
void PerformTest() override {
|
||||
ASSERT_TRUE(time_to_reconfigure_.Wait(kDefaultTimeoutMs))
|
||||
<< "Timed out before receiving an initial high bitrate.";
|
||||
encoder_config_.streams[0].width *= 2;
|
||||
encoder_config_.streams[0].height *= 2;
|
||||
frame_generator_->ChangeResolution(kDefaultWidth * 2, kDefaultHeight * 2);
|
||||
send_stream_->ReconfigureVideoEncoder(encoder_config_.Copy());
|
||||
EXPECT_TRUE(Wait())
|
||||
<< "Timed out while waiting for a couple of high bitrate estimates "
|
||||
@ -697,6 +726,7 @@ TEST_F(CallPerfTest, KeepsHighBitrateWhenReconfiguringSender) {
|
||||
int encoder_inits_;
|
||||
uint32_t last_set_bitrate_;
|
||||
VideoSendStream* send_stream_;
|
||||
test::FrameGeneratorCapturer* frame_generator_;
|
||||
VideoEncoderConfig encoder_config_;
|
||||
} test;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user