Commit f2e338d6 authored by Harald Alvestrand's avatar Harald Alvestrand Committed by Commit Bot

Add API for controlling SVC encoding.

This initial proof-of-concept is setting number of temporal layers only.

Intent to implement thread link (not containing intent to ship):
https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/--ZpYlTo6LE

Bug: 986069
Change-Id: I6bd094d6166637a6899b7d2a63a2905accb7857c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1710555Reviewed-by: default avatarFlorent Castelli <orphis@chromium.org>
Reviewed-by: default avatarGuido Urdaneta <guidou@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Commit-Queue: Harald Alvestrand <hta@chromium.org>
Cr-Commit-Position: refs/heads/master@{#681825}
parent 8c832df7
......@@ -8,4 +8,5 @@ dictionary RTCRtpCodecCapability {
required unsigned long clockRate;
unsigned short channels;
DOMString sdpFmtpLine;
};
\ No newline at end of file
[Enabled=RTCSvcScalabilityMode] sequence<DOMString> scalabilityModes;
};
......@@ -21,4 +21,5 @@ dictionary RTCRtpEncodingParameters : RTCRtpCodingParameters {
unsigned long maxBitrate;
//TODO(orphis): Missing maxFramerate. https://crbug.com/857047
double scaleResolutionDownBy;
[Enabled=RTCSvcScalabilityMode] DOMString scalabilityMode;
};
......@@ -276,6 +276,14 @@ webrtc::RtpEncodingParameters ToRtpEncodingParameters(
webrtc_encoding.scale_resolution_down_by =
encoding->scaleResolutionDownBy();
}
// https://w3c.github.io/webrtc-svc/
if (encoding->hasScalabilityMode()) {
if (encoding->scalabilityMode() == "L1T2") {
webrtc_encoding.num_temporal_layers = 2;
} else if (encoding->scalabilityMode() == "L1T3") {
webrtc_encoding.num_temporal_layers = 3;
}
}
return webrtc_encoding;
}
......@@ -393,6 +401,16 @@ RTCRtpSendParameters* RTCRtpSender::getParameters() {
PriorityFromDouble(webrtc_encoding.bitrate_priority).c_str());
encoding->setNetworkPriority(
PriorityFromDouble(webrtc_encoding.network_priority).c_str());
if (webrtc_encoding.num_temporal_layers) {
if (*webrtc_encoding.num_temporal_layers == 2) {
encoding->setScalabilityMode("L1T2");
} else if (*webrtc_encoding.num_temporal_layers == 3) {
encoding->setScalabilityMode("L1T3");
} else {
LOG(ERROR) << "Not understood value of num_temporal_layers: "
<< *webrtc_encoding.num_temporal_layers;
}
}
encodings.push_back(encoding);
}
parameters->setEncodings(encodings);
......@@ -576,6 +594,13 @@ RTCRtpCapabilities* RTCRtpSender::getCapabilities(const String& kind) {
}
codec->setSdpFmtpLine(sdp_fmtp_line.c_str());
}
if (rtc_codec.mime_type() == "video/VP8" ||
rtc_codec.mime_type() == "video/VP9") {
Vector<String> modes;
modes.push_back("L1T2");
modes.push_back("L1T3");
codec->setScalabilityModes(modes);
}
codecs.push_back(codec);
}
capabilities->setCodecs(codecs);
......
......@@ -1371,6 +1371,11 @@
origin_trial_feature_name: "RTCStatsRelativePacketArrivalDelay",
status: "experimental",
},
// Enables the use of SVC scalability mode in WebRTC.
// Spec: https://w3c.github.io/webrtc-svc/
{
name: "RTCSvcScalabilityMode",
},
// Enables the use of |RTCConfiguration::sdpSemantics| to override the
// default SDP semantics at RTCPeerConnection construction.
{
......
<!doctype html>
<meta charset=utf-8>
<title>RTCRtpParameters encodings</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/webrtc/dictionary-helper.js"></script>
<script src="/webrtc/RTCRtpParameters-helper.js"></script>
<script>
'use strict';
// Test is based on the following editor draft:
// https://w3c.github.io/webrtc-svc/
// Get the first encoding in param.encodings.
// Asserts that param.encodings has at least one element.
function getFirstEncoding(param) {
const { encodings } = param;
assert_equals(encodings.length, 1);
return encodings[0];
}
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('video', {
sendEncodings: [{scalabilityMode: 'L1T3'}],
});
const param = sender.getParameters();
const encoding = getFirstEncoding(param);
assert_equals(encoding.scalabilityMode, 'L1T3');
}, `Setting scalabilityMode to a legal value should be accepted`);
promise_test(async t => {
const capabilities = RTCRtpSender.getCapabilities('video');
var svcSupported = false;
for (const codec of capabilities.codecs) {
if ('scalabilityModes' in codec && codec.scalabilityModes.length > 0) {
svcSupported = true;
}
}
assert_true(svcSupported);
}, `Sender capabilities should include at least some scalability modes`);
</script>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment