For #1998, refine PT for firefox, support RED

pull/2104/head
winlin 4 years ago
parent f47329a94c
commit 140f8b0fce

@ -647,9 +647,6 @@ srs_error_t SrsRtcPlayStream::send_packets(SrsRtcStream* source, const vector<Sr
// 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());
} }
@ -659,9 +656,6 @@ srs_error_t SrsRtcPlayStream::send_packets(SrsRtcStream* source, const vector<Sr
// 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());
} }

@ -1170,13 +1170,13 @@ void SrsRtcDummyBridger::on_unpublish()
SrsCodecPayload::SrsCodecPayload() SrsCodecPayload::SrsCodecPayload()
{ {
pt_ = 0; pt_of_publisher_ = pt_ = 0;
sample_ = 0; sample_ = 0;
} }
SrsCodecPayload::SrsCodecPayload(uint8_t pt, std::string encode_name, int sample) SrsCodecPayload::SrsCodecPayload(uint8_t pt, std::string encode_name, int sample)
{ {
pt_ = pt; pt_of_publisher_ = pt_ = pt;
name_ = encode_name; name_ = encode_name;
sample_ = sample; sample_ = sample;
} }
@ -1191,6 +1191,7 @@ SrsCodecPayload* SrsCodecPayload::copy()
cp->type_ = type_; cp->type_ = type_;
cp->pt_ = pt_; cp->pt_ = pt_;
cp->pt_of_publisher_ = cp->pt_of_publisher_;
cp->name_ = name_; cp->name_ = name_;
cp->sample_ = sample_; cp->sample_ = sample_;
cp->rtcp_fbs_ = rtcp_fbs_; cp->rtcp_fbs_ = rtcp_fbs_;
@ -1941,11 +1942,6 @@ 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_;
@ -1972,6 +1968,17 @@ srs_error_t SrsRtcAudioSendTrack::on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamSta
pkt->header.set_ssrc(track_desc_->ssrc_); pkt->header.set_ssrc(track_desc_->ssrc_);
// Should update PT, because subscriber may use different PT to publisher.
if (track_desc_->media_ && pkt->header.get_payload_type() == track_desc_->media_->pt_of_publisher_) {
// If PT is media from publisher, change to PT of media for subscriber.
pkt->header.set_payload_type(track_desc_->media_->pt_);
} else if (track_desc_->red_ && pkt->header.get_payload_type() == track_desc_->red_->pt_of_publisher_) {
// If PT is RED from publisher, change to PT of RED for subscriber.
pkt->header.set_payload_type(track_desc_->red_->pt_);
} else {
// TODO: FIXME: Should update PT for RTX.
}
// Put rtp packet to NACK/ARQ queue // Put rtp packet to NACK/ARQ queue
if (true) { if (true) {
SrsRtpPacket2* nack = pkt->copy(); SrsRtpPacket2* nack = pkt->copy();
@ -2028,6 +2035,17 @@ srs_error_t SrsRtcVideoSendTrack::on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamSta
pkt->header.set_ssrc(track_desc_->ssrc_); pkt->header.set_ssrc(track_desc_->ssrc_);
// Should update PT, because subscriber may use different PT to publisher.
if (track_desc_->media_ && pkt->header.get_payload_type() == track_desc_->media_->pt_of_publisher_) {
// If PT is media from publisher, change to PT of media for subscriber.
pkt->header.set_payload_type(track_desc_->media_->pt_);
} else if (track_desc_->red_ && pkt->header.get_payload_type() == track_desc_->red_->pt_of_publisher_) {
// If PT is RED from publisher, change to PT of RED for subscriber.
pkt->header.set_payload_type(track_desc_->red_->pt_);
} else {
// TODO: FIXME: Should update PT for RTX.
}
// Put rtp packet to NACK/ARQ queue // Put rtp packet to NACK/ARQ queue
if (true) { if (true) {
SrsRtpPacket2* nack = pkt->copy(); SrsRtpPacket2* nack = pkt->copy();

@ -280,6 +280,9 @@ class SrsCodecPayload
public: public:
std::string type_; std::string type_;
uint8_t pt_; uint8_t pt_;
// for publish, equals to PT of itself;
// for subscribe, is the PT of publisher;
uint8_t pt_of_publisher_;
std::string name_; std::string name_;
int sample_; int sample_;
@ -562,7 +565,6 @@ 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;

Loading…
Cancel
Save