1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

For #1998, Support Firefox, use PT in offer. 4.0.55

This commit is contained in:
winlin 2020-11-12 18:38:30 +08:00
parent 57b5204a10
commit 4650d47082
5 changed files with 57 additions and 25 deletions

View file

@ -155,6 +155,7 @@ For previous versions, please read:
## V4 changes ## V4 changes
* v4.0, 2020-11-12, For [#1998][bug #1998], Support Firefox, use PT in offer. 4.0.55
* v4.0, 2020-11-11, For [#1508][bug #1508], Transform http header name to upper camel case. 4.0.54 * v4.0, 2020-11-11, For [#1508][bug #1508], Transform http header name to upper camel case. 4.0.54
* v4.0, 2020-11-06, For [#1657][bug #1657], Read cached data first in SSL. 4.0.48 * v4.0, 2020-11-06, For [#1657][bug #1657], Read cached data first in SSL. 4.0.48
* v4.0, 2020-11-06, For [#1657][bug #1657-3], support HTTPS Streaming(HTTPS-FLV, etc). 4.0.47 * v4.0, 2020-11-06, For [#1657][bug #1657-3], support HTTPS Streaming(HTTPS-FLV, etc). 4.0.47
@ -1791,6 +1792,7 @@ Winlin
[bug #1657-1]: https://github.com/ossrs/srs/issues/1657#issuecomment-720889906 [bug #1657-1]: https://github.com/ossrs/srs/issues/1657#issuecomment-720889906
[bug #1657-2]: https://github.com/ossrs/srs/issues/1657#issuecomment-722904004 [bug #1657-2]: https://github.com/ossrs/srs/issues/1657#issuecomment-722904004
[bug #1657-3]: https://github.com/ossrs/srs/issues/1657#issuecomment-722971676 [bug #1657-3]: https://github.com/ossrs/srs/issues/1657#issuecomment-722971676
[bug #1998]: https://github.com/ossrs/srs/issues/1998
[bug #zzzzzzzzzzzzz]: https://github.com/ossrs/srs/issues/zzzzzzzzzzzzz [bug #zzzzzzzzzzzzz]: https://github.com/ossrs/srs/issues/zzzzzzzzzzzzz
[exo #828]: https://github.com/google/ExoPlayer/pull/828 [exo #828]: https://github.com/google/ExoPlayer/pull/828

View file

@ -646,6 +646,10 @@ srs_error_t SrsRtcPlayStream::send_packets(SrsRtcStream* source, const vector<Sr
if (pkt->is_audio()) { if (pkt->is_audio()) {
// TODO: FIXME: Any simple solution? // TODO: FIXME: Any simple solution?
SrsRtcAudioSendTrack* audio_track = audio_tracks_[pkt->header.get_ssrc()]; SrsRtcAudioSendTrack* audio_track = audio_tracks_[pkt->header.get_ssrc()];
// The player may change the PT, so it's not equal to publisher's.
pkt->header.set_payload_type(audio_track->get_track_media_pt());
if ((err = audio_track->on_rtp(pkt, info)) != srs_success) { if ((err = audio_track->on_rtp(pkt, info)) != srs_success) {
return srs_error_wrap(err, "audio track, SSRC=%u, SEQ=%u", pkt->header.get_ssrc(), pkt->header.get_sequence()); return srs_error_wrap(err, "audio track, SSRC=%u, SEQ=%u", pkt->header.get_ssrc(), pkt->header.get_sequence());
} }
@ -654,6 +658,10 @@ srs_error_t SrsRtcPlayStream::send_packets(SrsRtcStream* source, const vector<Sr
} else { } else {
// TODO: FIXME: Any simple solution? // TODO: FIXME: Any simple solution?
SrsRtcVideoSendTrack* video_track = video_tracks_[pkt->header.get_ssrc()]; SrsRtcVideoSendTrack* video_track = video_tracks_[pkt->header.get_ssrc()];
// The player may change the PT, so it's not equal to publisher's.
pkt->header.set_payload_type(video_track->get_track_media_pt());
if ((err = video_track->on_rtp(pkt, info)) != srs_success) { if ((err = video_track->on_rtp(pkt, info)) != srs_success) {
return srs_error_wrap(err, "video track, SSRC=%u, SEQ=%u", pkt->header.get_ssrc(), pkt->header.get_sequence()); return srs_error_wrap(err, "video track, SSRC=%u, SEQ=%u", pkt->header.get_ssrc(), pkt->header.get_sequence());
} }
@ -2580,11 +2588,30 @@ srs_error_t SrsRtcConnection::on_binding_request(SrsStunPacket* r)
return err; return err;
} }
// For example, 42001f 42e01f, see https://blog.csdn.net/epubcn/article/details/102802108 bool srs_sdp_has_h264_profile(const SrsMediaPayloadType& payload_type, const string& profile)
bool srs_sdp_has_h264_profile(const SrsSdp& sdp, const string& profile)
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
if (payload_type.format_specific_param_.empty()) {
return false;
}
H264SpecificParam h264_param;
if ((err = srs_parse_h264_fmtp(payload_type.format_specific_param_, h264_param)) != srs_success) {
srs_error_reset(err);
return false;
}
if (h264_param.profile_level_id == profile) {
return true;
}
return false;
}
// For example, 42001f 42e01f, see https://blog.csdn.net/epubcn/article/details/102802108
bool srs_sdp_has_h264_profile(const SrsSdp& sdp, const string& profile)
{
for (size_t i = 0; i < sdp.media_descs_.size(); ++i) { for (size_t i = 0; i < sdp.media_descs_.size(); ++i) {
const SrsMediaDesc& desc = sdp.media_descs_[i]; const SrsMediaDesc& desc = sdp.media_descs_[i];
if (!desc.is_video()) { if (!desc.is_video()) {
@ -2598,17 +2625,7 @@ bool srs_sdp_has_h264_profile(const SrsSdp& sdp, const string& profile)
for (std::vector<SrsMediaPayloadType>::iterator it = payloads.begin(); it != payloads.end(); ++it) { for (std::vector<SrsMediaPayloadType>::iterator it = payloads.begin(); it != payloads.end(); ++it) {
const SrsMediaPayloadType& payload_type = *it; const SrsMediaPayloadType& payload_type = *it;
if (srs_sdp_has_h264_profile(payload_type, profile)) {
if (payload_type.format_specific_param_.empty()) {
continue;
}
H264SpecificParam h264_param;
if ((err = srs_parse_h264_fmtp(payload_type.format_specific_param_, h264_param)) != srs_success) {
srs_error_reset(err); continue;
}
if (h264_param.profile_level_id == profile) {
return true; return true;
} }
} }
@ -2917,6 +2934,7 @@ srs_error_t SrsRtcConnection::negotiate_play_capability(SrsRequest* req, const S
bool nack_enabled = _srs_config->get_rtc_nack_enabled(req->vhost); bool nack_enabled = _srs_config->get_rtc_nack_enabled(req->vhost);
bool twcc_enabled = _srs_config->get_rtc_twcc_enabled(req->vhost); bool twcc_enabled = _srs_config->get_rtc_twcc_enabled(req->vhost);
bool has_42e01f = srs_sdp_has_h264_profile(remote_sdp, "42e01f");
SrsRtcStream* source = NULL; SrsRtcStream* source = NULL;
if ((err = _srs_rtc_sources->fetch_or_create(req, &source)) != srs_success) { if ((err = _srs_rtc_sources->fetch_or_create(req, &source)) != srs_success) {
@ -2925,6 +2943,7 @@ srs_error_t SrsRtcConnection::negotiate_play_capability(SrsRequest* req, const S
for (size_t i = 0; i < remote_sdp.media_descs_.size(); ++i) { for (size_t i = 0; i < remote_sdp.media_descs_.size(); ++i) {
const SrsMediaDesc& remote_media_desc = remote_sdp.media_descs_[i]; const SrsMediaDesc& remote_media_desc = remote_sdp.media_descs_[i];
// Whether feature enabled in remote extmap. // Whether feature enabled in remote extmap.
int remote_twcc_id = 0; int remote_twcc_id = 0;
if (true) { if (true) {
@ -2938,33 +2957,41 @@ srs_error_t SrsRtcConnection::negotiate_play_capability(SrsRequest* req, const S
} }
std::vector<SrsRtcTrackDescription*> track_descs; std::vector<SrsRtcTrackDescription*> track_descs;
std::vector<std::string> remote_rtcp_fb; SrsMediaPayloadType* remote_payload = NULL;
if (remote_media_desc.is_audio()) { if (remote_media_desc.is_audio()) {
// TODO: check opus format specific param // TODO: check opus format specific param
std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("opus"); vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("opus");
if (payloads.empty()) { if (payloads.empty()) {
return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no valid found opus payload type"); return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no valid found opus payload type");
} }
SrsMediaPayloadType payload = payloads.at(0); remote_payload = &payloads.at(0);
remote_rtcp_fb = payload.rtcp_fb_;
track_descs = source->get_track_desc("audio", "opus"); track_descs = source->get_track_desc("audio", "opus");
} else if (remote_media_desc.is_video()) { } else if (remote_media_desc.is_video()) {
// TODO: check opus format specific param // TODO: check opus format specific param
std::vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("H264"); vector<SrsMediaPayloadType> payloads = remote_media_desc.find_media_with_encoding_name("H264");
if (payloads.empty()) { if (payloads.empty()) {
return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no valid found h264 payload type"); return srs_error_new(ERROR_RTC_SDP_EXCHANGE, "no valid found h264 payload type");
} }
SrsMediaPayloadType payload = payloads.at(0); for (int j = 0; j < (int)payloads.size(); j++) {
remote_rtcp_fb = payload.rtcp_fb_; SrsMediaPayloadType& payload = payloads.at(j);
// If exists 42e01f profile, choose it; otherwise, use the first payload.
if (!has_42e01f || srs_sdp_has_h264_profile(payload, "42e01f")) {
remote_payload = &payloads.at(j);
break;
}
}
track_descs = source->get_track_desc("video", "H264"); track_descs = source->get_track_desc("video", "H264");
} }
for (int i = 0; i < (int)track_descs.size(); ++i) { for (int i = 0; i < (int)track_descs.size(); ++i) {
SrsRtcTrackDescription* track = track_descs[i]->copy(); SrsRtcTrackDescription* track = track_descs[i]->copy();
// Use remote/source/offer PayloadType.
track->media_->pt_ = remote_payload->payload_type_;
track->mid_ = remote_media_desc.mid_; track->mid_ = remote_media_desc.mid_;
uint32_t publish_ssrc = track->ssrc_; uint32_t publish_ssrc = track->ssrc_;

View file

@ -1941,6 +1941,11 @@ std::string SrsRtcSendTrack::get_track_id()
return track_desc_->id_; return track_desc_->id_;
} }
int SrsRtcSendTrack::get_track_media_pt()
{
return track_desc_->media_->pt_;
}
void SrsRtcSendTrack::on_recv_nack() void SrsRtcSendTrack::on_recv_nack()
{ {
SrsRtcTrackStatistic* statistic = statistic_; SrsRtcTrackStatistic* statistic = statistic_;

View file

@ -426,9 +426,6 @@ public:
int get_rtp_extension_id(std::string uri); int get_rtp_extension_id(std::string uri);
public: public:
SrsRtcTrackDescription* copy(); SrsRtcTrackDescription* copy();
public:
// find media with payload type.
SrsMediaPayloadType generate_media_payload_type(int payload_type);
}; };
class SrsRtcStreamDescription class SrsRtcStreamDescription
@ -565,6 +562,7 @@ public:
bool set_track_status(bool active); bool set_track_status(bool active);
bool get_track_status(); bool get_track_status();
std::string get_track_id(); std::string get_track_id();
int get_track_media_pt();
public: public:
virtual srs_error_t on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamStatistic& info) = 0; virtual srs_error_t on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamStatistic& info) = 0;
virtual srs_error_t on_rtcp(SrsRtpPacket2* pkt) = 0; virtual srs_error_t on_rtcp(SrsRtpPacket2* pkt) = 0;

View file

@ -24,6 +24,6 @@
#ifndef SRS_CORE_VERSION4_HPP #ifndef SRS_CORE_VERSION4_HPP
#define SRS_CORE_VERSION4_HPP #define SRS_CORE_VERSION4_HPP
#define SRS_VERSION4_REVISION 54 #define SRS_VERSION4_REVISION 55
#endif #endif