Skip to content

Commit e8fe66e

Browse files
authored
RTC: Support av1 for Chrome M90 enabled it. 4.0.91 (#2324)
* RTC: Support av1 for Chrome M90 enabled it. 4.0.91 * RTC: Show codec for WebRTC publisher
1 parent a9d39f6 commit e8fe66e

File tree

7 files changed

+93
-5
lines changed

7 files changed

+93
-5
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ Other important wiki:
157157

158158
## V4 changes
159159

160+
* v4.0, 2021-04-29, RTC: Support av1 for Chrome M90. 4.0.91
160161
* v4.0, 2021-04-24, Change push-RTSP as deprecated feature.
161162
* v4.0, 2021-04-24, Player: Change the default from RTMP to HTTP-FLV.
162163
* v4.0, 2021-04-24, Disable CherryPy by --cherrypy=off. 4.0.90

trunk/research/players/js/srs.sdk.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,3 +470,32 @@ function SrsRtcPlayerAsync() {
470470
return self;
471471
}
472472

473+
// Format the codec of RTCRtpSender, kind(audio/video) is optional filter.
474+
// https://developer.mozilla.org/en-US/docs/Web/Media/Formats/WebRTC_codecs#getting_the_supported_codecs
475+
function SrsRtcFormatSenders(senders, kind) {
476+
var codecs = [];
477+
senders.forEach(function (sender) {
478+
sender.getParameters().codecs.forEach(function(c) {
479+
if (kind && sender.track.kind !== kind) {
480+
return;
481+
}
482+
483+
if (c.mimeType.indexOf('/red') > 0 || c.mimeType.indexOf('/rtx') > 0 || c.mimeType.indexOf('/fec') > 0) {
484+
return;
485+
}
486+
487+
var s = '';
488+
489+
s += c.mimeType.replace('audio/', '').replace('video/', '');
490+
s += ', ' + c.clockRate + 'HZ';
491+
if (sender.track.kind === "audio") {
492+
s += ', channels: ' + c.channels;
493+
}
494+
s += ', pt: ' + c.payloadType;
495+
496+
codecs.push(s);
497+
});
498+
});
499+
return codecs.join(", ");
500+
}
501+

trunk/research/players/rtc_publisher.html

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@
5555
<label></label>
5656
SessionID: <span id='sessionid'></span>
5757

58+
<label></label>
59+
Audio: <span id='acodecs'></span><br/>
60+
Video: <span id='vcodecs'></span>
61+
5862
<label></label>
5963
Simulator: <a href='#' id='simulator-drop'>Drop</a>
6064

@@ -81,6 +85,14 @@
8185
$('#rtc_media_player').prop('srcObject', event.stream);
8286
};
8387

88+
// https://developer.mozilla.org/en-US/docs/Web/Media/Formats/WebRTC_codecs#getting_the_supported_codecs
89+
sdk.pc.onicegatheringstatechange = function (event) {
90+
if (sdk.pc.iceGatheringState === "complete") {
91+
$('#acodecs').html(SrsRtcFormatSenders(sdk.pc.getSenders(), "audio"));
92+
$('#vcodecs').html(SrsRtcFormatSenders(sdk.pc.getSenders(), "video"));
93+
}
94+
};
95+
8496
// For example:
8597
// webrtc://r.ossrs.net/live/livestream
8698
var url = $("#txt_url").val();

trunk/src/app/srs_app_rtc_api.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,18 +134,20 @@ srs_error_t SrsGoApiRtcPlay::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMe
134134

135135
// For client to specifies the EIP of server.
136136
string eip = r->query_get("eip");
137+
string codec = r->query_get("codec");
137138
// For client to specifies whether encrypt by SRTP.
138139
string srtp = r->query_get("encrypt");
139140
string dtls = r->query_get("dtls");
140141

141-
srs_trace("RTC play %s, api=%s, clientip=%s, app=%s, stream=%s, offer=%dB, eip=%s, srtp=%s, dtls=%s",
142+
srs_trace("RTC play %s, api=%s, clientip=%s, app=%s, stream=%s, offer=%dB, eip=%s, codec=%s, srtp=%s, dtls=%s",
142143
streamurl.c_str(), api.c_str(), clientip.c_str(), app.c_str(), stream_name.c_str(), remote_sdp_str.length(), eip.c_str(),
143-
srtp.c_str(), dtls.c_str()
144+
codec.c_str(), srtp.c_str(), dtls.c_str()
144145
);
145146

146147
// The RTC user config object.
147148
SrsRtcUserConfig ruc;
148149
ruc.eip_ = eip;
150+
ruc.codec_ = codec;
149151
ruc.publish_ = false;
150152
ruc.dtls_ = (dtls != "false");
151153

@@ -500,14 +502,17 @@ srs_error_t SrsGoApiRtcPublish::do_serve_http(ISrsHttpResponseWriter* w, ISrsHtt
500502

501503
// For client to specifies the EIP of server.
502504
string eip = r->query_get("eip");
505+
string codec = r->query_get("codec");
503506

504-
srs_trace("RTC publish %s, api=%s, clientip=%s, app=%s, stream=%s, offer=%dB, eip=%s",
505-
streamurl.c_str(), api.c_str(), clientip.c_str(), app.c_str(), stream_name.c_str(), remote_sdp_str.length(), eip.c_str()
507+
srs_trace("RTC publish %s, api=%s, clientip=%s, app=%s, stream=%s, offer=%dB, eip=%s, codec=%s",
508+
streamurl.c_str(), api.c_str(), clientip.c_str(), app.c_str(), stream_name.c_str(), remote_sdp_str.length(), eip.c_str(),
509+
codec.c_str()
506510
);
507511

508512
// The RTC user config object.
509513
SrsRtcUserConfig ruc;
510514
ruc.eip_ = eip;
515+
ruc.codec_ = codec;
511516
ruc.publish_ = true;
512517
ruc.dtls_ = ruc.srtp_ = true;
513518

trunk/src/app/srs_app_rtc_conn.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2771,6 +2771,38 @@ srs_error_t SrsRtcConnection::negotiate_publish_capability(SrsRtcUserConfig* ruc
27712771
// Only choose one match opus codec.
27722772
break;
27732773
}
2774+
} else if (remote_media_desc.is_video() && ruc->codec_ == "av1") {
2775+
std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("AV1X");
2776+
if (payloads.empty()) {
2777+
return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no found valid AV1 payload type");
2778+
}
2779+
2780+
for (int j = 0; j < (int)payloads.size(); j++) {
2781+
const SrsMediaPayloadType& payload = payloads.at(j);
2782+
2783+
// Generate video payload for av1.
2784+
SrsVideoPayload* video_payload = new SrsVideoPayload(payload.payload_type_, payload.encoding_name_, payload.clock_rate_);
2785+
2786+
// TODO: FIXME: Only support some transport algorithms.
2787+
for (int k = 0; k < (int)payload.rtcp_fb_.size(); ++k) {
2788+
const string& rtcp_fb = payload.rtcp_fb_.at(k);
2789+
2790+
if (nack_enabled) {
2791+
if (rtcp_fb == "nack" || rtcp_fb == "nack pli") {
2792+
video_payload->rtcp_fbs_.push_back(rtcp_fb);
2793+
}
2794+
}
2795+
if (twcc_enabled && remote_twcc_id) {
2796+
if (rtcp_fb == "transport-cc") {
2797+
video_payload->rtcp_fbs_.push_back(rtcp_fb);
2798+
}
2799+
}
2800+
}
2801+
2802+
track_desc->type_ = "video";
2803+
track_desc->set_codec_payload((SrsCodecPayload*)video_payload);
2804+
break;
2805+
}
27742806
} else if (remote_media_desc.is_video()) {
27752807
std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("H264");
27762808
if (payloads.empty()) {
@@ -3050,6 +3082,14 @@ srs_error_t SrsRtcConnection::negotiate_play_capability(SrsRtcUserConfig* ruc, s
30503082

30513083
remote_payload = payloads.at(0);
30523084
track_descs = source->get_track_desc("audio", "opus");
3085+
} else if (remote_media_desc.is_video() && ruc->codec_ == "av1") {
3086+
std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("AV1X");
3087+
if (payloads.empty()) {
3088+
return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no found valid AV1 payload type");
3089+
}
3090+
3091+
remote_payload = payloads.at(0);
3092+
track_descs = source->get_track_desc("video", "AV1X");
30533093
} else if (remote_media_desc.is_video()) {
30543094
// TODO: check opus format specific param
30553095
vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("H264");

trunk/src/app/srs_app_rtc_server.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ class SrsRtcUserConfig
9292
// Original variables from API.
9393
SrsSdp remote_sdp_;
9494
std::string eip_;
95+
std::string codec_;
9596

9697
// Generated data.
9798
SrsRequest* req_;

trunk/src/core/srs_core_version4.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@
2626

2727
#define VERSION_MAJOR 4
2828
#define VERSION_MINOR 0
29-
#define VERSION_REVISION 90
29+
#define VERSION_REVISION 91
3030

3131
#endif

0 commit comments

Comments
 (0)