Skip to content

Commit 90b8ecc

Browse files
ossrs-aiwinlinvip
authored andcommitted
AI: Support VP9 codec for WebRTC.
1 parent ba4eafb commit 90b8ecc

File tree

6 files changed

+61
-1
lines changed

6 files changed

+61
-1
lines changed

trunk/src/app/srs_app_rtc_conn.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3402,6 +3402,38 @@ srs_error_t SrsRtcPublisherNegotiator::negotiate_publish_capability(SrsRtcUserCo
34023402
}
34033403
}
34043404

3405+
track_desc->type_ = "video";
3406+
track_desc->set_codec_payload((SrsCodecPayload *)video_payload);
3407+
break;
3408+
}
3409+
} else if (remote_media_desc.is_video() && srs_video_codec_str2id(ruc->codec_) == SrsVideoCodecIdVP9) {
3410+
std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("VP9");
3411+
if (payloads.empty()) {
3412+
return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no found valid VP9 payload type");
3413+
}
3414+
3415+
for (int j = 0; j < (int)payloads.size(); j++) {
3416+
const SrsMediaPayloadType &payload = payloads.at(j);
3417+
3418+
// Generate video payload for vp9.
3419+
SrsVideoPayload *video_payload = new SrsVideoPayload(payload.payload_type_, payload.encoding_name_, payload.clock_rate_);
3420+
3421+
// TODO: FIXME: Only support some transport algorithms.
3422+
for (int k = 0; k < (int)payload.rtcp_fb_.size(); ++k) {
3423+
const string &rtcp_fb = payload.rtcp_fb_.at(k);
3424+
3425+
if (nack_enabled) {
3426+
if (rtcp_fb == "nack" || rtcp_fb == "nack pli") {
3427+
video_payload->rtcp_fbs_.push_back(rtcp_fb);
3428+
}
3429+
}
3430+
if (twcc_enabled && remote_twcc_id) {
3431+
if (rtcp_fb == "transport-cc") {
3432+
video_payload->rtcp_fbs_.push_back(rtcp_fb);
3433+
}
3434+
}
3435+
}
3436+
34053437
track_desc->type_ = "video";
34063438
track_desc->set_codec_payload((SrsCodecPayload *)video_payload);
34073439
break;
@@ -3804,6 +3836,14 @@ srs_error_t SrsRtcPlayerNegotiator::negotiate_play_capability(SrsRtcUserConfig *
38043836
// @see https://bugs.chromium.org/p/webrtc/issues/detail?id=13166
38053837
track_descs = source->get_track_desc("video", "AV1X");
38063838
}
3839+
} else if (prefer_codec == SrsVideoCodecIdVP9) {
3840+
std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("VP9");
3841+
if (payloads.empty()) {
3842+
return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no found valid VP9 payload type");
3843+
}
3844+
3845+
remote_payload = payloads.at(0);
3846+
track_descs = source->get_track_desc("video", "VP9");
38073847
} else if (prefer_codec == SrsVideoCodecIdHEVC) {
38083848
std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("H265");
38093849
if (payloads.empty()) {

trunk/src/app/srs_app_rtc_source.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3926,6 +3926,13 @@ srs_error_t SrsRtcFormat::on_rtp_packet(SrsRtcRecvTrack *track, bool is_audio)
39263926
srs_video_codec_id2str(codec_id).c_str(),
39273927
srs_hevc_profile2str(profile).c_str(),
39283928
level_id);
3929+
} else if (codec_id == SrsVideoCodecIdAV1 || codec_id == SrsVideoCodecIdVP9) {
3930+
// AV1 and VP9 are relay-only codecs for WebRTC-to-WebRTC
3931+
// No detailed profile/level parsing needed for relay mode
3932+
if ((err = stat_->on_video_info(req_, codec_id, 0, 0, 0, 0)) != srs_success) {
3933+
return srs_error_wrap(err, "stat video info");
3934+
}
3935+
srs_trace("RTC: parsed %s codec", srs_video_codec_id2str(codec_id).c_str());
39293936
}
39303937
}
39313938

trunk/src/app/srs_app_statistic.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,12 @@ srs_error_t SrsStatisticStream::dumps(SrsJsonObject *obj)
154154
} else if (vcodec_ == SrsVideoCodecIdHEVC) {
155155
video->set("profile", SrsJsonAny::str(srs_hevc_profile2str(hevc_profile_).c_str()));
156156
video->set("level", SrsJsonAny::str(srs_hevc_level2str(hevc_level_).c_str()));
157+
} else if (vcodec_ == SrsVideoCodecIdAV1) {
158+
video->set("profile", SrsJsonAny::null());
159+
video->set("level", SrsJsonAny::null());
160+
} else if (vcodec_ == SrsVideoCodecIdVP9) {
161+
video->set("profile", SrsJsonAny::null());
162+
video->set("level", SrsJsonAny::null());
157163
} else {
158164
video->set("profile", SrsJsonAny::str("Other"));
159165
video->set("level", SrsJsonAny::str("Other"));

trunk/src/kernel/srs_kernel_codec.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,8 @@ string srs_video_codec_id2str(SrsVideoCodecId codec)
8282
return "HEVC";
8383
case SrsVideoCodecIdAV1:
8484
return "AV1";
85+
case SrsVideoCodecIdVP9:
86+
return "VP9";
8587
case SrsVideoCodecIdReserved:
8688
case SrsVideoCodecIdReserved1:
8789
case SrsVideoCodecIdReserved2:
@@ -105,6 +107,8 @@ SrsVideoCodecId srs_video_codec_str2id(const std::string &codec)
105107
return SrsVideoCodecIdHEVC;
106108
} else if (upper_codec == "AV1") {
107109
return SrsVideoCodecIdAV1;
110+
} else if (upper_codec == "VP9") {
111+
return SrsVideoCodecIdVP9;
108112
} else if (upper_codec == "VP6") {
109113
return SrsVideoCodecIdOn2VP6;
110114
} else if (upper_codec == "VP6A") {

trunk/src/kernel/srs_kernel_codec.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,10 @@ enum SrsVideoCodecId {
6161
SrsVideoCodecIdAVC = 7,
6262
// See page 79 at @doc https://github.com/CDN-Union/H265/blob/master/Document/video_file_format_spec_v10_1_ksyun_20170615.doc
6363
SrsVideoCodecIdHEVC = 12,
64-
// https://mp.weixin.qq.com/s/H3qI7zsON5sdf4oDJ9qlkg
64+
// AV1 codec for WebRTC, https://github.com/ossrs/srs/pull/2324
6565
SrsVideoCodecIdAV1 = 13,
66+
// VP9 codec for WebRTC, https://github.com/ossrs/srs/pull/4565
67+
SrsVideoCodecIdVP9 = 14,
6668
};
6769
std::string srs_video_codec_id2str(SrsVideoCodecId codec);
6870
SrsVideoCodecId srs_video_codec_str2id(const std::string &codec);

trunk/src/kernel/srs_kernel_ts.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,7 @@ srs_error_t SrsTsContext::encode(ISrsStreamWriter *writer, SrsTsMessage *msg, Sr
443443
case SrsVideoCodecIdOn2VP6WithAlphaChannel:
444444
case SrsVideoCodecIdScreenVideoVersion2:
445445
case SrsVideoCodecIdAV1:
446+
case SrsVideoCodecIdVP9:
446447
vs = SrsTsStreamReserved;
447448
break;
448449
}

0 commit comments

Comments
 (0)