Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1364)

Unified Diff: webrtc/video/video_encoder_unittest.cc

Issue 1328863002: Allow encoders to fall back dynamically to software. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebased Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webrtc/video/video_encoder.cc ('k') | webrtc/video_encoder.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webrtc/video/video_encoder_unittest.cc
diff --git a/webrtc/video/video_encoder_unittest.cc b/webrtc/video/video_encoder_unittest.cc
index 5f2c37a016959748e0a15b411130bdf25908c326..f84835620bf51eb94bc9e98f04fc8ac9d6372f04 100644
--- a/webrtc/video/video_encoder_unittest.cc
+++ b/webrtc/video/video_encoder_unittest.cc
@@ -15,6 +15,8 @@
namespace webrtc {
+const int kWidth = 320;
+const int kHeight = 240;
const size_t kMaxPayloadSize = 800;
class VideoEncoderSoftwareFallbackWrapperTest : public ::testing::Test {
@@ -34,7 +36,7 @@ class VideoEncoderSoftwareFallbackWrapperTest : public ::testing::Test {
const CodecSpecificInfo* codec_specific_info,
const std::vector<FrameType>* frame_types) override {
++encode_count_;
- return WEBRTC_VIDEO_CODEC_OK;
+ return encode_return_code_;
}
int32_t RegisterEncodeCompleteCallback(
@@ -67,6 +69,7 @@ class VideoEncoderSoftwareFallbackWrapperTest : public ::testing::Test {
int init_encode_count_ = 0;
int32_t init_encode_return_code_ = WEBRTC_VIDEO_CODEC_OK;
+ int32_t encode_return_code_ = WEBRTC_VIDEO_CODEC_OK;
int encode_count_ = 0;
EncodedImageCallback* encode_complete_callback_ = nullptr;
int release_count_ = 0;
@@ -87,6 +90,8 @@ class VideoEncoderSoftwareFallbackWrapperTest : public ::testing::Test {
};
void UtilizeFallbackEncoder();
+ void FallbackFromEncodeRequest();
+ void EncodeFrame();
FakeEncodedImageCallback callback_;
CountingFakeEncoder fake_encoder_;
@@ -95,9 +100,22 @@ class VideoEncoderSoftwareFallbackWrapperTest : public ::testing::Test {
VideoFrame frame_;
};
+void VideoEncoderSoftwareFallbackWrapperTest::EncodeFrame() {
+ frame_.CreateEmptyFrame(kWidth, kHeight, kWidth, (kWidth + 1) / 2,
+ (kWidth + 1) / 2);
+ memset(frame_.buffer(webrtc::kYPlane), 16,
+ frame_.allocated_size(webrtc::kYPlane));
+ memset(frame_.buffer(webrtc::kUPlane), 128,
+ frame_.allocated_size(webrtc::kUPlane));
+ memset(frame_.buffer(webrtc::kVPlane), 128,
+ frame_.allocated_size(webrtc::kVPlane));
+
+ std::vector<FrameType> types(1, kKeyFrame);
+ EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
+ fallback_wrapper_.Encode(frame_, nullptr, &types));
+}
+
void VideoEncoderSoftwareFallbackWrapperTest::UtilizeFallbackEncoder() {
- static const int kWidth = 320;
- static const int kHeight = 240;
fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_);
EXPECT_EQ(&callback_, fake_encoder_.encode_complete_callback_);
@@ -111,20 +129,31 @@ void VideoEncoderSoftwareFallbackWrapperTest::UtilizeFallbackEncoder() {
fallback_wrapper_.InitEncode(&codec_, 2, kMaxPayloadSize));
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.SetRates(300, 30));
- frame_.CreateEmptyFrame(kWidth, kHeight, kWidth, (kWidth + 1) / 2,
- (kWidth + 1) / 2);
- memset(frame_.buffer(webrtc::kYPlane), 16,
- frame_.allocated_size(webrtc::kYPlane));
- memset(frame_.buffer(webrtc::kUPlane), 128,
- frame_.allocated_size(webrtc::kUPlane));
- memset(frame_.buffer(webrtc::kVPlane), 128,
- frame_.allocated_size(webrtc::kVPlane));
+ int callback_count = callback_.callback_count_;
+ int encode_count = fake_encoder_.encode_count_;
+ EncodeFrame();
+ EXPECT_EQ(encode_count, fake_encoder_.encode_count_);
+ EXPECT_EQ(callback_count + 1, callback_.callback_count_);
+}
- std::vector<FrameType> types(1, kKeyFrame);
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
- fallback_wrapper_.Encode(frame_, nullptr, &types));
- EXPECT_EQ(0, fake_encoder_.encode_count_);
- EXPECT_GT(callback_.callback_count_, 0);
+void VideoEncoderSoftwareFallbackWrapperTest::FallbackFromEncodeRequest() {
+ fallback_wrapper_.RegisterEncodeCompleteCallback(&callback_);
+ codec_.codecType = kVideoCodecVP8;
+ codec_.maxFramerate = 30;
+ codec_.width = kWidth;
+ codec_.height = kHeight;
+ fallback_wrapper_.InitEncode(&codec_, 2, kMaxPayloadSize);
+ EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.SetRates(300, 30));
+ EXPECT_EQ(1, fake_encoder_.init_encode_count_);
+
+ // Have the non-fallback encoder request a software fallback.
+ fake_encoder_.encode_return_code_ = WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE;
+ int callback_count = callback_.callback_count_;
+ int encode_count = fake_encoder_.encode_count_;
+ EncodeFrame();
+ // Single encode request, which returned failure.
+ EXPECT_EQ(encode_count + 1, fake_encoder_.encode_count_);
+ EXPECT_EQ(callback_count + 1, callback_.callback_count_);
}
TEST_F(VideoEncoderSoftwareFallbackWrapperTest, InitializesEncoder) {
@@ -133,22 +162,35 @@ TEST_F(VideoEncoderSoftwareFallbackWrapperTest, InitializesEncoder) {
EXPECT_EQ(1, fake_encoder_.init_encode_count_);
}
+TEST_F(VideoEncoderSoftwareFallbackWrapperTest, EncodeRequestsFallback) {
+ FallbackFromEncodeRequest();
+ // After fallback, further encodes shouldn't hit the fake encoder.
+ int encode_count = fake_encoder_.encode_count_;
+ EncodeFrame();
+ EXPECT_EQ(encode_count, fake_encoder_.encode_count_);
+}
+
TEST_F(VideoEncoderSoftwareFallbackWrapperTest, CanUtilizeFallbackEncoder) {
UtilizeFallbackEncoder();
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
}
TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
- InternalEncoderNotReleasedDuringFallback) {
+ InternalEncoderReleasedDuringFallback) {
+ EXPECT_EQ(0, fake_encoder_.release_count_);
UtilizeFallbackEncoder();
+ EXPECT_EQ(1, fake_encoder_.release_count_);
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
- EXPECT_EQ(0, fake_encoder_.release_count_);
+ // No extra release when the fallback is released.
+ EXPECT_EQ(1, fake_encoder_.release_count_);
}
TEST_F(VideoEncoderSoftwareFallbackWrapperTest,
InternalEncoderNotEncodingDuringFallback) {
UtilizeFallbackEncoder();
- EXPECT_EQ(0, fake_encoder_.encode_count_);
+ int encode_count = fake_encoder_.encode_count_;
+ EncodeFrame();
+ EXPECT_EQ(encode_count, fake_encoder_.encode_count_);
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, fallback_wrapper_.Release());
}
« no previous file with comments | « webrtc/video/video_encoder.cc ('k') | webrtc/video_encoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698