From 2708752a9b3da3c1768ec2c0cf3dc451454c6e91 Mon Sep 17 00:00:00 2001 From: chundonglinlin Date: Tue, 7 Mar 2023 20:45:57 +0800 Subject: [PATCH] HEVC: webrtc support hevc on safari. v6.0.34 (#3441) Co-authored-by: winlin Co-authored-by: ChenGH --- trunk/doc/CHANGELOG.md | 1 + trunk/src/app/srs_app_rtc_conn.cpp | 46 ++++++++++++++++++++++++++++ trunk/src/core/srs_core_version6.hpp | 2 +- 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 27971a27a..ba643fe44 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,6 +8,7 @@ The changelog for SRS. ## SRS 6.0 Changelog +* v6.0, 2023-03-07, Merge [#3441](https://github.com/ossrs/srs/pull/3441): HEVC: webrtc support hevc on safari. v6.0.34 (#3441) * v6.0, 2023-03-07, Merge [#3446](https://github.com/ossrs/srs/pull/3446): WebRTC: Warning if no ideal profile. v6.0.33 (#3446) * v6.0, 2023-03-06, Merge [#3445](https://github.com/ossrs/srs/pull/3445): Support configure for generic linux. v6.0.32 (#3445) * v6.0, 2023-03-04, Merge [#3105](https://github.com/ossrs/srs/pull/3105): Kickoff publisher when stream is idle, which means no players. v6.0.31 (#3105) diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 90d5d6540..d8ff18075 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -2670,6 +2670,40 @@ srs_error_t SrsRtcConnection::negotiate_publish_capability(SrsRtcUserConfig* ruc } } + track_desc->type_ = "video"; + track_desc->set_codec_payload((SrsCodecPayload*)video_payload); + break; + } + } else if (remote_media_desc.is_video() && ruc->codec_ == "hevc") { + std::vector payloads = remote_media_desc.find_media_with_encoding_name("H265"); + if (payloads.empty()) { + return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no found valid H.265 payload type"); + } + + // TODO: FIXME: pick up a profile for HEVC. + // @see https://www.rfc-editor.org/rfc/rfc7798#section-7.2.1 + for (int j = 0; j < (int)payloads.size(); j++) { + const SrsMediaPayloadType& payload = payloads.at(j); + + // Generate video payload for hevc. + SrsVideoPayload* video_payload = new SrsVideoPayload(payload.payload_type_, payload.encoding_name_, payload.clock_rate_); + + // TODO: FIXME: Only support some transport algorithms. + for (int k = 0; k < (int)payload.rtcp_fb_.size(); ++k) { + const string& rtcp_fb = payload.rtcp_fb_.at(k); + + if (nack_enabled) { + if (rtcp_fb == "nack" || rtcp_fb == "nack pli") { + video_payload->rtcp_fbs_.push_back(rtcp_fb); + } + } + if (twcc_enabled && remote_twcc_id) { + if (rtcp_fb == "transport-cc") { + video_payload->rtcp_fbs_.push_back(rtcp_fb); + } + } + } + track_desc->type_ = "video"; track_desc->set_codec_payload((SrsCodecPayload*)video_payload); break; @@ -3024,6 +3058,18 @@ srs_error_t SrsRtcConnection::negotiate_play_capability(SrsRtcUserConfig* ruc, s // @see https://bugs.chromium.org/p/webrtc/issues/detail?id=13166 track_descs = source->get_track_desc("video", "AV1X"); } + } else if (remote_media_desc.is_video() && ruc->codec_ == "hevc") { + std::vector payloads = remote_media_desc.find_media_with_encoding_name("H265"); + if (payloads.empty()) { + return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no valid found h265 payload type"); + } + + remote_payload = payloads.at(0); + + // TODO: FIXME: pick up a profile for HEVC. + // @see https://www.rfc-editor.org/rfc/rfc7798#section-7.2.1 + + track_descs = source->get_track_desc("video", "H265"); } else if (remote_media_desc.is_video()) { // TODO: check opus format specific param vector payloads = remote_media_desc.find_media_with_encoding_name("H264"); diff --git a/trunk/src/core/srs_core_version6.hpp b/trunk/src/core/srs_core_version6.hpp index d5ec73ef1..7a17a2437 100644 --- a/trunk/src/core/srs_core_version6.hpp +++ b/trunk/src/core/srs_core_version6.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 6 #define VERSION_MINOR 0 -#define VERSION_REVISION 33 +#define VERSION_REVISION 34 #endif