Don't reinit encoder when rotation changes.

TESTED=By rotating phone in AppRTCMobile.
BUG=webrtc:7535

Review-Url: https://codereview.webrtc.org/2853463004
Cr-Commit-Position: refs/heads/master@{#17985}
This commit is contained in:
brandtr
2017-05-03 03:40:58 -07:00
committed by Commit bot
parent 080830c513
commit 70e39e159e
4 changed files with 45 additions and 11 deletions

View File

@ -83,6 +83,7 @@ Vp8UnitTestEncodeCompleteCallback::OnEncodedImage(
encoded_frame_->_timeStamp = encoded_frame._timeStamp; encoded_frame_->_timeStamp = encoded_frame._timeStamp;
encoded_frame_->_frameType = encoded_frame._frameType; encoded_frame_->_frameType = encoded_frame._frameType;
encoded_frame_->_completeFrame = encoded_frame._completeFrame; encoded_frame_->_completeFrame = encoded_frame._completeFrame;
encoded_frame_->rotation_ = encoded_frame.rotation_;
encoded_frame_->qp_ = encoded_frame.qp_; encoded_frame_->qp_ = encoded_frame.qp_;
codec_specific_info_->codecType = codec_specific_info->codecType; codec_specific_info_->codecType = codec_specific_info->codecType;
// Skip |codec_name|, to avoid allocating. // Skip |codec_name|, to avoid allocating.
@ -273,6 +274,26 @@ TEST_F(TestVp8Impl, EncoderParameterTest) {
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, decoder_->InitDecode(&codec_settings_, 1)); EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, decoder_->InitDecode(&codec_settings_, 1));
} }
// We only test the encoder here, since the decoded frame rotation is set based
// on the CVO RTP header extension in VCMDecodedFrameCallback::Decoded.
// TODO(brandtr): Consider passing through the rotation flag through the decoder
// in the same way as done in the encoder.
TEST_F(TestVp8Impl, EncodedRotationEqualsInputRotation) {
SetUpEncodeDecode();
input_frame_->set_rotation(kVideoRotation_0);
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
encoder_->Encode(*input_frame_, nullptr, nullptr));
WaitForEncodedFrame();
EXPECT_EQ(kVideoRotation_0, encoded_frame_.rotation_);
input_frame_->set_rotation(kVideoRotation_90);
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
encoder_->Encode(*input_frame_, nullptr, nullptr));
WaitForEncodedFrame();
EXPECT_EQ(kVideoRotation_90, encoded_frame_.rotation_);
}
TEST_F(TestVp8Impl, DecodedQpEqualsEncodedQp) { TEST_F(TestVp8Impl, DecodedQpEqualsEncodedQp) {
SetUpEncodeDecode(); SetUpEncodeDecode();
encoder_->Encode(*input_frame_, nullptr, nullptr); encoder_->Encode(*input_frame_, nullptr, nullptr);

View File

@ -66,6 +66,25 @@ TEST_F(TestVp9Impl, EncodeDecode) {
EXPECT_GT(I420PSNR(input_frame_.get(), decoded_frame.get()), 36); EXPECT_GT(I420PSNR(input_frame_.get(), decoded_frame.get()), 36);
} }
// We only test the encoder here, since the decoded frame rotation is set based
// on the CVO RTP header extension in VCMDecodedFrameCallback::Decoded.
// TODO(brandtr): Consider passing through the rotation flag through the decoder
// in the same way as done in the encoder.
TEST_F(TestVp9Impl, EncodedRotationEqualsInputRotation) {
input_frame_->set_rotation(kVideoRotation_0);
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
encoder_->Encode(*input_frame_, nullptr, nullptr));
EncodedImage encoded_frame;
ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame));
EXPECT_EQ(kVideoRotation_0, encoded_frame.rotation_);
input_frame_->set_rotation(kVideoRotation_90);
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
encoder_->Encode(*input_frame_, nullptr, nullptr));
ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame));
EXPECT_EQ(kVideoRotation_90, encoded_frame.rotation_);
}
TEST_F(TestVp9Impl, DecodedQpEqualsEncodedQp) { TEST_F(TestVp9Impl, DecodedQpEqualsEncodedQp) {
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
encoder_->Encode(*input_frame_, nullptr, nullptr)); encoder_->Encode(*input_frame_, nullptr, nullptr));

View File

@ -483,8 +483,8 @@ void ViEEncoder::ConfigureEncoderOnTaskQueue(VideoEncoderConfig config,
if (last_frame_info_) { if (last_frame_info_) {
ReconfigureEncoder(); ReconfigureEncoder();
} else if (settings_.internal_source) { } else if (settings_.internal_source) {
last_frame_info_ = rtc::Optional<VideoFrameInfo>( last_frame_info_ =
VideoFrameInfo(176, 144, kVideoRotation_0, false)); rtc::Optional<VideoFrameInfo>(VideoFrameInfo(176, 144, false));
ReconfigureEncoder(); ReconfigureEncoder();
} }
} }
@ -653,16 +653,13 @@ void ViEEncoder::EncodeVideoFrame(const VideoFrame& video_frame,
if (!last_frame_info_ || video_frame.width() != last_frame_info_->width || if (!last_frame_info_ || video_frame.width() != last_frame_info_->width ||
video_frame.height() != last_frame_info_->height || video_frame.height() != last_frame_info_->height ||
video_frame.rotation() != last_frame_info_->rotation ||
video_frame.is_texture() != last_frame_info_->is_texture) { video_frame.is_texture() != last_frame_info_->is_texture) {
pending_encoder_reconfiguration_ = true; pending_encoder_reconfiguration_ = true;
last_frame_info_ = rtc::Optional<VideoFrameInfo>( last_frame_info_ = rtc::Optional<VideoFrameInfo>(VideoFrameInfo(
VideoFrameInfo(video_frame.width(), video_frame.height(), video_frame.width(), video_frame.height(), video_frame.is_texture()));
video_frame.rotation(), video_frame.is_texture()));
LOG(LS_INFO) << "Video frame parameters changed: dimensions=" LOG(LS_INFO) << "Video frame parameters changed: dimensions="
<< last_frame_info_->width << "x" << last_frame_info_->height << last_frame_info_->width << "x" << last_frame_info_->height
<< ", rotation=" << last_frame_info_->rotation << ", texture=" << last_frame_info_->is_texture << ".";
<< ", texture=" << last_frame_info_->is_texture;
} }
if (initial_rampup_ < kMaxInitialFramedrop && if (initial_rampup_ < kMaxInitialFramedrop &&

View File

@ -133,15 +133,12 @@ class ViEEncoder : public rtc::VideoSinkInterface<VideoFrame>,
public: public:
VideoFrameInfo(int width, VideoFrameInfo(int width,
int height, int height,
VideoRotation rotation,
bool is_texture) bool is_texture)
: width(width), : width(width),
height(height), height(height),
rotation(rotation),
is_texture(is_texture) {} is_texture(is_texture) {}
int width; int width;
int height; int height;
VideoRotation rotation;
bool is_texture; bool is_texture;
int pixel_count() const { return width * height; } int pixel_count() const { return width * height; }
}; };