Reuse VP9 simulcast stream limits for H.265.
H.265 should have limits probably between VP9 and AV1, instead of using VP8 tables. For now we reuse VP9 tables but eventually we may create table for H.265. Bug: chromium:41480904 Change-Id: I6dc2ec629142ee06f1c82a2df30d753ec1353496 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/368240 Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Reviewed-by: Sergey Silkin <ssilkin@webrtc.org> Commit-Queue: Jianlin Qiu <jianlin.qiu@intel.com> Cr-Commit-Position: refs/heads/main@{#43404}
This commit is contained in:
parent
7ef1360485
commit
f54707cd71
@ -137,6 +137,40 @@ constexpr const SimulcastFormat kSimulcastFormatsVP9[] = {
|
|||||||
webrtc::DataRate::KilobitsPerSec(0),
|
webrtc::DataRate::KilobitsPerSec(0),
|
||||||
webrtc::DataRate::KilobitsPerSec(30)}};
|
webrtc::DataRate::KilobitsPerSec(30)}};
|
||||||
|
|
||||||
|
// TODO(crbugs.com/41480904): For now this table is just a copy from VP9, and
|
||||||
|
// needs to be tuned for H.265.
|
||||||
|
// These tables describe from which resolution we can use how many simulcast
|
||||||
|
// layers at what bitrates (maximum, target, and minimum).
|
||||||
|
// Important!! Keep this table from high resolution to low resolution.
|
||||||
|
constexpr const SimulcastFormat kSimulcastFormatsH265[] = {
|
||||||
|
{1920, 1080, 3, webrtc::DataRate::KilobitsPerSec(3367),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(3367),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(769)},
|
||||||
|
{1280, 720, 3, webrtc::DataRate::KilobitsPerSec(1524),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(1524),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(481)},
|
||||||
|
{960, 540, 3, webrtc::DataRate::KilobitsPerSec(879),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(879),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(337)},
|
||||||
|
{640, 360, 2, webrtc::DataRate::KilobitsPerSec(420),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(420),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(193)},
|
||||||
|
{480, 270, 2, webrtc::DataRate::KilobitsPerSec(257),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(257),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(121)},
|
||||||
|
{320, 180, 1, webrtc::DataRate::KilobitsPerSec(142),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(142),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(30)},
|
||||||
|
{240, 135, 1, webrtc::DataRate::KilobitsPerSec(101),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(101),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(30)},
|
||||||
|
// As the resolution goes down, interpolate the target and max bitrates down
|
||||||
|
// towards zero. The min bitrate is still limited at 30 kbps and the target
|
||||||
|
// and the max will be capped from below accordingly.
|
||||||
|
{0, 0, 1, webrtc::DataRate::KilobitsPerSec(0),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(0),
|
||||||
|
webrtc::DataRate::KilobitsPerSec(30)}};
|
||||||
|
|
||||||
constexpr webrtc::DataRate Interpolate(const webrtc::DataRate& a,
|
constexpr webrtc::DataRate Interpolate(const webrtc::DataRate& a,
|
||||||
const webrtc::DataRate& b,
|
const webrtc::DataRate& b,
|
||||||
float rate) {
|
float rate) {
|
||||||
@ -162,6 +196,10 @@ std::vector<SimulcastFormat> GetSimulcastFormats(
|
|||||||
formats.insert(formats.begin(), std::begin(kSimulcastFormatsVP9),
|
formats.insert(formats.begin(), std::begin(kSimulcastFormatsVP9),
|
||||||
std::end(kSimulcastFormatsVP9));
|
std::end(kSimulcastFormatsVP9));
|
||||||
break;
|
break;
|
||||||
|
case webrtc::kVideoCodecH265:
|
||||||
|
formats.insert(formats.begin(), std::begin(kSimulcastFormatsH265),
|
||||||
|
std::end(kSimulcastFormatsH265));
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
formats.insert(formats.begin(), std::begin(kSimulcastFormatsVP8),
|
formats.insert(formats.begin(), std::begin(kSimulcastFormatsVP8),
|
||||||
std::end(kSimulcastFormatsVP8));
|
std::end(kSimulcastFormatsVP8));
|
||||||
|
|||||||
@ -413,4 +413,33 @@ TEST(SimulcastTest, BitratesForVP9) {
|
|||||||
EXPECT_NEAR(streams[2].min_bitrate_bps, 481000, 20000);
|
EXPECT_NEAR(streams[2].min_bitrate_bps, 481000, 20000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef RTC_ENABLE_H265
|
||||||
|
TEST(SimulcastTest, BitratesForH265) {
|
||||||
|
ExplicitKeyValueConfig trials("");
|
||||||
|
|
||||||
|
const size_t kMaxLayers = 3;
|
||||||
|
std::vector<VideoStream> streams = cricket::GetSimulcastConfig(
|
||||||
|
CreateResolutions(/*max_width=*/1280, /*max_height=*/720, kMaxLayers),
|
||||||
|
!kScreenshare, true, trials, webrtc::kVideoCodecH265);
|
||||||
|
|
||||||
|
ASSERT_THAT(streams, SizeIs(kMaxLayers));
|
||||||
|
EXPECT_EQ(1280u, streams[2].width);
|
||||||
|
EXPECT_EQ(720u, streams[2].height);
|
||||||
|
EXPECT_EQ(streams[2].max_bitrate_bps, 1524000);
|
||||||
|
EXPECT_EQ(streams[2].target_bitrate_bps, 1524000);
|
||||||
|
EXPECT_EQ(streams[2].min_bitrate_bps, 481000);
|
||||||
|
|
||||||
|
streams = cricket::GetSimulcastConfig(
|
||||||
|
CreateResolutions(/*max_width=*/1276, /*max_height=*/716, kMaxLayers),
|
||||||
|
!kScreenshare, true, trials, webrtc::kVideoCodecH265);
|
||||||
|
|
||||||
|
ASSERT_THAT(streams, SizeIs(kMaxLayers));
|
||||||
|
EXPECT_EQ(1276u, streams[2].width);
|
||||||
|
EXPECT_EQ(716u, streams[2].height);
|
||||||
|
EXPECT_NEAR(streams[2].max_bitrate_bps, 1524000, 20000);
|
||||||
|
EXPECT_NEAR(streams[2].target_bitrate_bps, 1524000, 20000);
|
||||||
|
EXPECT_NEAR(streams[2].min_bitrate_bps, 481000, 20000);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user