diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 1c2c8c199..03eddcdea 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -525,6 +525,35 @@ void SrsRtcPlayStream::nack_fetch(vector& pkts, uint32_t ssrc, u } } +void SrsRtcPlayStream::set_track_status(bool status) +{ + std::ostringstream merged_log; + + // set video track status + if (true) { + std::map::iterator it; + for (it = video_tracks_.begin(); it != video_tracks_.end(); ++it) { + SrsRtcVideoSendTrack* track = it->second; + + 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::map::iterator it; + for (it = audio_tracks_.begin(); it != audio_tracks_.end(); ++it) { + SrsRtcAudioSendTrack* track = it->second; + + bool previous = track->set_track_status(status); + merged_log << "{track: " << track->get_track_id() << ", is_active: " << previous << "=>" << status << "},"; + } + } + + srs_trace("set status, %s", merged_log.str().c_str()); +} + srs_error_t SrsRtcPlayStream::notify(int type, srs_utime_t interval, srs_utime_t tick) { srs_error_t err = srs_success; @@ -2276,6 +2305,19 @@ srs_error_t SrsRtcConnection::do_send_packets(const std::vector& return err; } +srs_error_t SrsRtcConnection::set_play_track_status(bool status) +{ + srs_error_t err = srs_success; + + if (!player_) { + return srs_error_new(ERROR_RTC_NO_PLAYER, "set play track status"); + } + + player_->set_track_status(status); + + return err; +} + #ifdef SRS_OSX // These functions are similar to the older byteorder(3) family of functions. // For example, be32toh() is identical to ntohl(). diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index f90ae8721..240da89d6 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -208,6 +208,8 @@ private: srs_error_t send_packets(SrsRtcStream* source, const std::vector& pkts, SrsRtcPlayStreamStatistic& info); public: void nack_fetch(std::vector& pkts, uint32_t ssrc, uint16_t seq); + // Directly set the status of track, generally for init to set the default value. + void set_track_status(bool status); // interface ISrsHourGlass public: virtual srs_error_t notify(int type, srs_utime_t interval, srs_utime_t tick); @@ -409,6 +411,8 @@ public: void simulate_nack_drop(int nn); 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_play_track_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 ea5280895..8991f1b9d 100644 --- a/trunk/src/app/srs_app_rtc_server.cpp +++ b/trunk/src/app/srs_app_rtc_server.cpp @@ -413,6 +413,10 @@ 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_play_track_status(true); } std::string local_pwd = srs_random_str(32); diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 579b4af1d..da49573ac 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -1756,9 +1756,11 @@ SrsRtpPacket2* SrsRtcSendTrack::fetch_rtp_packet(uint16_t seq) } // TODO: FIXME: Should refine logs, set tracks in a time. -void SrsRtcSendTrack::set_track_status(bool active) +bool SrsRtcSendTrack::set_track_status(bool active) { + bool previous_status = track_desc_->is_active_; track_desc_->is_active_ = active; + return previous_status; } bool SrsRtcSendTrack::get_track_status() diff --git a/trunk/src/app/srs_app_rtc_source.hpp b/trunk/src/app/srs_app_rtc_source.hpp index a4ba09973..ecfad71f5 100644 --- a/trunk/src/app/srs_app_rtc_source.hpp +++ b/trunk/src/app/srs_app_rtc_source.hpp @@ -510,7 +510,7 @@ public: public: bool has_ssrc(uint32_t ssrc); SrsRtpPacket2* fetch_rtp_packet(uint16_t seq); - void set_track_status(bool active); + bool set_track_status(bool active); bool get_track_status(); std::string get_track_id(); public: diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index 111338f04..e77923ae1 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -356,6 +356,7 @@ #define ERROR_RTC_STREM_STARTED 5025 #define ERROR_RTC_STREAM_DESC 5026 #define ERROR_RTC_TRACK_CODEC 5027 +#define ERROR_RTC_NO_PLAYER 5028 /////////////////////////////////////////////////////// // GB28181 API error.