diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 1816273d8..72fabbb85 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -647,9 +647,6 @@ srs_error_t SrsRtcPlayStream::send_packets(SrsRtcStream* source, const vectorheader.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) { 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 vectorheader.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) { return srs_error_wrap(err, "video track, SSRC=%u, SEQ=%u", pkt->header.get_ssrc(), pkt->header.get_sequence()); } diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index adf54960c..5dee80776 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -1170,13 +1170,13 @@ void SrsRtcDummyBridger::on_unpublish() SrsCodecPayload::SrsCodecPayload() { - pt_ = 0; + pt_of_publisher_ = pt_ = 0; sample_ = 0; } SrsCodecPayload::SrsCodecPayload(uint8_t pt, std::string encode_name, int sample) { - pt_ = pt; + pt_of_publisher_ = pt_ = pt; name_ = encode_name; sample_ = sample; } @@ -1191,6 +1191,7 @@ SrsCodecPayload* SrsCodecPayload::copy() cp->type_ = type_; cp->pt_ = pt_; + cp->pt_of_publisher_ = cp->pt_of_publisher_; cp->name_ = name_; cp->sample_ = sample_; cp->rtcp_fbs_ = rtcp_fbs_; @@ -1941,11 +1942,6 @@ std::string SrsRtcSendTrack::get_track_id() return track_desc_->id_; } -int SrsRtcSendTrack::get_track_media_pt() -{ - return track_desc_->media_->pt_; -} - void SrsRtcSendTrack::on_recv_nack() { SrsRtcTrackStatistic* statistic = statistic_; @@ -1972,6 +1968,17 @@ srs_error_t SrsRtcAudioSendTrack::on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamSta 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 if (true) { SrsRtpPacket2* nack = pkt->copy(); @@ -2028,6 +2035,17 @@ srs_error_t SrsRtcVideoSendTrack::on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamSta 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 if (true) { SrsRtpPacket2* nack = pkt->copy(); diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index 57736cdeb..e2b7d5f2b 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -280,6 +280,9 @@ class SrsCodecPayload public: std::string type_; 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_; int sample_; @@ -562,7 +565,6 @@ public: bool set_track_status(bool active); bool get_track_status(); std::string get_track_id(); - int get_track_media_pt(); public: virtual srs_error_t on_rtp(SrsRtpPacket2* pkt, SrsRtcPlayStreamStatistic& info) = 0; virtual srs_error_t on_rtcp(SrsRtpPacket2* pkt) = 0;