RTC: Set tracks to active for publisher

pull/1895/head
winlin 5 years ago
parent dd13889772
commit c659098f71

@ -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<SrsRtcVideoRecvTrack*>::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<SrsRtcAudioRecvTrack*>::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<SrsRtpPacket2*>&
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

@ -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<SrsRtpPacket2*>& 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

@ -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.

@ -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;

@ -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:

@ -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());
}
}

Loading…
Cancel
Save