diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 6fb1f3e30..be85223ab 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -551,7 +551,7 @@ void SrsRtcPlayStream::set_all_tracks_status(bool status) } } - srs_trace("set status, %s", merged_log.str().c_str()); + srs_trace("RTC: Init tracks %s ok", merged_log.str().c_str()); } srs_error_t SrsRtcPlayStream::notify(int type, srs_utime_t interval, srs_utime_t tick) @@ -922,6 +922,35 @@ srs_error_t SrsRtcPublishStream::start() return err; } +void SrsRtcPublishStream::set_all_tracks_status(bool status) +{ + std::ostringstream merged_log; + + // set video track status + if (true) { + std::vector::iterator it; + for (it = video_tracks_.begin(); it != video_tracks_.end(); ++it) { + SrsRtcVideoRecvTrack* track = *it; + + bool previous = track->set_track_status(status); + merged_log << "{track: " << track->get_track_id() << ", is_active: " << previous << "=>" << status << "},"; + } + } + + // set audio track status + if (true) { + std::vector::iterator it; + for (it = audio_tracks_.begin(); it != audio_tracks_.end(); ++it) { + SrsRtcAudioRecvTrack* track = *it; + + bool previous = track->set_track_status(status); + merged_log << "{track: " << track->get_track_id() << ", is_active: " << previous << "=>" << status << "},"; + } + } + + srs_trace("RTC: Init tracks %s ok", merged_log.str().c_str()); +} + srs_error_t SrsRtcPublishStream::send_rtcp_rr() { srs_error_t err = srs_success; @@ -2305,17 +2334,15 @@ srs_error_t SrsRtcConnection::do_send_packets(const std::vector& return err; } -srs_error_t SrsRtcConnection::set_all_tracks_status_for_play(bool status) +void SrsRtcConnection::set_all_tracks_status(bool status) { - srs_error_t err = srs_success; - - if (!player_) { - return srs_error_new(ERROR_RTC_NO_PLAYER, "set play track status"); + if (player_) { + player_->set_all_tracks_status(status); } - player_->set_all_tracks_status(status); - - return err; + if (publisher_) { + publisher_->set_all_tracks_status(status); + } } #ifdef SRS_OSX diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index 59814ab73..607bcb6ad 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -259,6 +259,8 @@ public: public: srs_error_t initialize(SrsRequest* req, SrsRtcStreamDescription* stream_desc); srs_error_t start(); + // Directly set the status of track, generally for init to set the default value. + void set_all_tracks_status(bool status); private: srs_error_t send_rtcp_rr(); srs_error_t send_rtcp_xr_rrtr(); @@ -412,7 +414,7 @@ public: void simulate_player_drop_packet(SrsRtpHeader* h, int nn_bytes); srs_error_t do_send_packets(const std::vector& pkts, SrsRtcPlayStreamStatistic& info); // Directly set the status of play track, generally for init to set the default value. - srs_error_t set_all_tracks_status_for_play(bool status); + void set_all_tracks_status(bool status); private: srs_error_t on_binding_request(SrsStunPacket* r); // publish media capabilitiy negotiate diff --git a/trunk/src/app/srs_app_rtc_server.cpp b/trunk/src/app/srs_app_rtc_server.cpp index ccafc026e..38a20856e 100644 --- a/trunk/src/app/srs_app_rtc_server.cpp +++ b/trunk/src/app/srs_app_rtc_server.cpp @@ -414,12 +414,11 @@ srs_error_t SrsRtcServer::do_create_session( if ((err = session->add_player(req, remote_sdp, local_sdp)) != srs_success) { return srs_error_wrap(err, "add player"); } - - // TODO: FIXME: Handle error. - // All tracks default as inactive, so we must enable them. - session->set_all_tracks_status_for_play(true); } + // All tracks default as inactive, so we must enable them. + session->set_all_tracks_status(true); + std::string local_pwd = srs_random_str(32); std::string local_ufrag = ""; // TODO: FIXME: Rename for a better name, it's not an username. diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index da49573ac..a72153473 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -1589,6 +1589,23 @@ srs_error_t SrsRtcRecvTrack::send_rtcp_xr_rrtr() return err; } +bool SrsRtcRecvTrack::set_track_status(bool active) +{ + bool previous_status = track_desc_->is_active_; + track_desc_->is_active_ = active; + return previous_status; +} + +bool SrsRtcRecvTrack::get_track_status() +{ + return track_desc_->is_active_; +} + +std::string SrsRtcRecvTrack::get_track_id() +{ + return track_desc_->id_; +} + srs_error_t SrsRtcRecvTrack::on_nack(SrsRtpPacket2* pkt) { srs_error_t err = srs_success; diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index ecfad71f5..60033408e 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -465,6 +465,9 @@ public: void update_send_report_time(const SrsNtp& ntp); srs_error_t send_rtcp_rr(); srs_error_t send_rtcp_xr_rrtr(); + bool set_track_status(bool active); + bool get_track_status(); + std::string get_track_id(); protected: srs_error_t on_nack(SrsRtpPacket2* pkt); public: diff --git a/trunk/src/utest/srs_utest_rtc.cpp b/trunk/src/utest/srs_utest_rtc.cpp index f88ae78bc..7ceeb8d96 100644 --- a/trunk/src/utest/srs_utest_rtc.cpp +++ b/trunk/src/utest/srs_utest_rtc.cpp @@ -135,7 +135,7 @@ VOID TEST(KernelRTCTest, DefaultTrackStatus) EXPECT_FALSE(td.is_active_); } - // Enable it by player or connection. + // Enable it by player. if (true) { SrsRtcConnection s(NULL, SrsContextId()); SrsRtcPlayStream play(&s, SrsContextId()); SrsRtcAudioSendTrack* audio; SrsRtcVideoSendTrack *video; @@ -155,5 +155,26 @@ VOID TEST(KernelRTCTest, DefaultTrackStatus) EXPECT_TRUE(audio->get_track_status()); EXPECT_TRUE(video->get_track_status()); } + + // Enable it by publisher. + if (true) { + SrsRtcConnection s(NULL, SrsContextId()); SrsRtcPublishStream publish(&s); + SrsRtcAudioRecvTrack* audio; SrsRtcVideoRecvTrack *video; + + if (true) { + SrsRtcTrackDescription ds; ds.type_ = "audio"; ds.id_ = "NSNWOn19NDn12o8nNeji2"; ds.ssrc_ = 100; + audio = new SrsRtcAudioRecvTrack(&s, &ds); publish.audio_tracks_.push_back(audio); + } + if (true) { + SrsRtcTrackDescription ds; ds.type_ = "video"; ds.id_ = "VMo22nfLDn122nfnDNL2"; ds.ssrc_ = 200; + video = new SrsRtcVideoRecvTrack(&s, &ds); publish.video_tracks_.push_back(video); + } + EXPECT_FALSE(audio->get_track_status()); + EXPECT_FALSE(video->get_track_status()); + + publish.set_all_tracks_status(true); + EXPECT_TRUE(audio->get_track_status()); + EXPECT_TRUE(video->get_track_status()); + } }