1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-13 11:51:57 +00:00

RTC: Add callback for all consumers done

This commit is contained in:
winlin 2020-08-17 20:08:11 +08:00
parent 88d4314a3c
commit ab221fa842
4 changed files with 25 additions and 0 deletions

View file

@ -1272,6 +1272,11 @@ void SrsRtcPublishStream::request_keyframe(uint32_t ssrc)
session_->stat_->nn_pli++;
}
void SrsRtcPublishStream::on_consumers_finished()
{
session_->on_consumers_finished(req->get_stream_url());
}
srs_error_t SrsRtcPublishStream::notify(int type, srs_utime_t interval, srs_utime_t tick)
{
srs_error_t err = srs_success;
@ -1863,6 +1868,13 @@ srs_error_t SrsRtcConnection::on_rtcp_feedback_remb(SrsRtcpPsfbCommon *rtcp)
return srs_success;
}
void SrsRtcConnection::on_consumers_finished(std::string url)
{
if (hijacker_) {
hijacker_->on_consumers_finished(url);
}
}
void SrsRtcConnection::set_hijacker(ISrsRtcConnectionHijacker* h)
{
hijacker_ = h;

View file

@ -321,6 +321,7 @@ private:
srs_error_t on_rtcp_xr(SrsRtcpXr* rtcp);
public:
void request_keyframe(uint32_t ssrc);
void on_consumers_finished();
// interface ISrsHourGlass
public:
virtual srs_error_t notify(int type, srs_utime_t interval, srs_utime_t tick);
@ -362,6 +363,8 @@ public:
virtual ~ISrsRtcConnectionHijacker();
public:
virtual srs_error_t on_dtls_done() = 0;
// Notify when all consumers of publisher(specified by url) is finished.
virtual void on_consumers_finished(std::string url) = 0;
};
// A RTC Peer Connection, SDP level object.
@ -450,6 +453,8 @@ private:
public:
srs_error_t on_rtcp_feedback_twcc(char* buf, int nb_buf);
srs_error_t on_rtcp_feedback_remb(SrsRtcpPsfbCommon *rtcp);
public:
void on_consumers_finished(std::string url);
void set_hijacker(ISrsRtcConnectionHijacker* h);
public:
srs_error_t on_connection_established();

View file

@ -406,6 +406,11 @@ void SrsRtcStream::on_consumer_destroy(SrsRtcConsumer* consumer)
if (it != consumers.end()) {
consumers.erase(it);
}
// When all consumers finished, notify publisher to handle it.
if (publish_stream_ && consumers.empty()) {
publish_stream_->on_consumers_finished();
}
}
bool SrsRtcStream::can_publish()

View file

@ -129,7 +129,10 @@ public:
ISrsRtcPublishStream();
virtual ~ISrsRtcPublishStream();
public:
// Request keyframe(PLI) from publisher, for fresh consumer.
virtual void request_keyframe(uint32_t ssrc) = 0;
// Notify publisher that all consumers is finished.
virtual void on_consumers_finished() = 0;
};
// A Source is a stream, to publish and to play with, binding to SrsRtcPublishStream and SrsRtcPlayStream.