Add resolution bitrate thresholds to EncoderInfo.
When provided, these thresholds will be used instead of WebRTC default
limits specified in DropDueToSize() and GetMaxDefaultVideoBitrateKbps().
Bug: none
Change-Id: Ida45ea832041963b8b8475d69114b5c60a172fb7
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/142170
Commit-Queue: Sergey Silkin <ssilkin@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Alex Glaznev <glaznev@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#28390}
diff --git a/sdk/android/native_unittests/codecs/wrapper_unittest.cc b/sdk/android/native_unittests/codecs/wrapper_unittest.cc
index d9f268d..d5a29d1 100644
--- a/sdk/android/native_unittests/codecs/wrapper_unittest.cc
+++ b/sdk/android/native_unittests/codecs/wrapper_unittest.cc
@@ -8,9 +8,13 @@
* be found in the AUTHORS file in the root of the source tree.
*/
-#include "sdk/android/native_api/codecs/wrapper.h"
+#include <memory>
+
+#include "absl/memory/memory.h"
#include "media/base/media_constants.h"
#include "sdk/android/generated_native_unittests_jni/CodecsWrapperTestHelper_jni.h"
+#include "sdk/android/native_api/codecs/wrapper.h"
+#include "sdk/android/src/jni/video_encoder_wrapper.h"
#include "test/gtest.h"
namespace webrtc {
@@ -30,6 +34,25 @@
ASSERT_NE(it, video_format.parameters.end());
EXPECT_EQ(cricket::kH264ProfileLevelConstrainedBaseline, it->second);
}
+
+TEST(JavaCodecsWrapperTest, JavaToNativeResolutionBitrateThresholds) {
+ JNIEnv* env = AttachCurrentThreadIfNeeded();
+ ScopedJavaLocalRef<jobject> j_fake_encoder =
+ jni::Java_CodecsWrapperTestHelper_createFakeVideoEncoder(env);
+
+ auto encoder = jni::JavaToNativeVideoEncoder(env, j_fake_encoder);
+ ASSERT_TRUE(encoder);
+
+ // Check that the resolution bitrate thresholds are correctly passed from Java
+ // to native.
+ const std::vector<VideoEncoder::ResolutionBitrateThresholds> thresholds =
+ encoder->GetEncoderInfo().resolution_bitrate_thresholds;
+ ASSERT_EQ(thresholds.size(), 1u);
+ EXPECT_EQ(thresholds[0].frame_size_pixels, 640 * 360);
+ EXPECT_EQ(thresholds[0].min_start_bitrate_bps, 300000);
+ EXPECT_EQ(thresholds[0].min_bitrate_bps, 200000);
+ EXPECT_EQ(thresholds[0].max_bitrate_bps, 1000000);
+}
} // namespace
} // namespace test
} // namespace webrtc
diff --git a/sdk/android/native_unittests/org/webrtc/CodecsWrapperTestHelper.java b/sdk/android/native_unittests/org/webrtc/CodecsWrapperTestHelper.java
index 0213574..70151d3 100644
--- a/sdk/android/native_unittests/org/webrtc/CodecsWrapperTestHelper.java
+++ b/sdk/android/native_unittests/org/webrtc/CodecsWrapperTestHelper.java
@@ -23,4 +23,9 @@
VideoCodecInfo codec_info = new VideoCodecInfo("H264", params);
return codec_info;
}
+
+ @CalledByNative
+ public static VideoEncoder createFakeVideoEncoder() {
+ return new FakeVideoEncoder();
+ }
}
diff --git a/sdk/android/native_unittests/org/webrtc/FakeVideoEncoder.java b/sdk/android/native_unittests/org/webrtc/FakeVideoEncoder.java
new file mode 100644
index 0000000..32a3ae4
--- /dev/null
+++ b/sdk/android/native_unittests/org/webrtc/FakeVideoEncoder.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2017 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+package org.webrtc;
+
+/**
+ * An implementation of VideoEncoder that is used for testing of functionalities of
+ * VideoEncoderWrapper.
+ */
+class FakeVideoEncoder implements VideoEncoder {
+ @Override
+ public VideoCodecStatus initEncode(Settings settings, Callback encodeCallback) {
+ return VideoCodecStatus.OK;
+ }
+
+ @Override
+ public VideoCodecStatus release() {
+ return VideoCodecStatus.OK;
+ }
+
+ @Override
+ public VideoCodecStatus encode(VideoFrame frame, EncodeInfo info) {
+ return VideoCodecStatus.OK;
+ }
+
+ @Override
+ public VideoCodecStatus setRateAllocation(BitrateAllocation allocation, int framerate) {
+ return VideoCodecStatus.OK;
+ }
+
+ @Override
+ public ScalingSettings getScalingSettings() {
+ return ScalingSettings.OFF;
+ }
+
+ @Override
+ public ResolutionBitrateThresholds[] getResolutionBitrateThresholds() {
+ ResolutionBitrateThresholds resolution_bitrate_thresholds[] = {
+ new ResolutionBitrateThresholds(/* frameSizePixels = */ 640 * 360,
+ /* minStartBitrateBps = */ 300000,
+ /* minBitrateBps = */ 200000,
+ /* maxBitrateBps = */ 1000000)};
+
+ return resolution_bitrate_thresholds;
+ }
+
+ @Override
+ public String getImplementationName() {
+ return "FakeVideoEncoder";
+ }
+}