1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-02-13 20:01:56 +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++; 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 SrsRtcPublishStream::notify(int type, srs_utime_t interval, srs_utime_t tick)
{ {
srs_error_t err = srs_success; srs_error_t err = srs_success;
@ -1863,6 +1868,13 @@ srs_error_t SrsRtcConnection::on_rtcp_feedback_remb(SrsRtcpPsfbCommon *rtcp)
return srs_success; return srs_success;
} }
void SrsRtcConnection::on_consumers_finished(std::string url)
{
if (hijacker_) {
hijacker_->on_consumers_finished(url);
}
}
void SrsRtcConnection::set_hijacker(ISrsRtcConnectionHijacker* h) void SrsRtcConnection::set_hijacker(ISrsRtcConnectionHijacker* h)
{ {
hijacker_ = h; hijacker_ = h;

View file

@ -321,6 +321,7 @@ private:
srs_error_t on_rtcp_xr(SrsRtcpXr* rtcp); srs_error_t on_rtcp_xr(SrsRtcpXr* rtcp);
public: public:
void request_keyframe(uint32_t ssrc); void request_keyframe(uint32_t ssrc);
void on_consumers_finished();
// interface ISrsHourGlass // interface ISrsHourGlass
public: public:
virtual srs_error_t notify(int type, srs_utime_t interval, srs_utime_t tick); virtual srs_error_t notify(int type, srs_utime_t interval, srs_utime_t tick);
@ -362,6 +363,8 @@ public:
virtual ~ISrsRtcConnectionHijacker(); virtual ~ISrsRtcConnectionHijacker();
public: public:
virtual srs_error_t on_dtls_done() = 0; 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. // A RTC Peer Connection, SDP level object.
@ -450,6 +453,8 @@ private:
public: public:
srs_error_t on_rtcp_feedback_twcc(char* buf, int nb_buf); srs_error_t on_rtcp_feedback_twcc(char* buf, int nb_buf);
srs_error_t on_rtcp_feedback_remb(SrsRtcpPsfbCommon *rtcp); srs_error_t on_rtcp_feedback_remb(SrsRtcpPsfbCommon *rtcp);
public:
void on_consumers_finished(std::string url);
void set_hijacker(ISrsRtcConnectionHijacker* h); void set_hijacker(ISrsRtcConnectionHijacker* h);
public: public:
srs_error_t on_connection_established(); srs_error_t on_connection_established();

View file

@ -406,6 +406,11 @@ void SrsRtcStream::on_consumer_destroy(SrsRtcConsumer* consumer)
if (it != consumers.end()) { if (it != consumers.end()) {
consumers.erase(it); 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() bool SrsRtcStream::can_publish()

View file

@ -129,7 +129,10 @@ public:
ISrsRtcPublishStream(); ISrsRtcPublishStream();
virtual ~ISrsRtcPublishStream(); virtual ~ISrsRtcPublishStream();
public: public:
// Request keyframe(PLI) from publisher, for fresh consumer.
virtual void request_keyframe(uint32_t ssrc) = 0; 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. // A Source is a stream, to publish and to play with, binding to SrsRtcPublishStream and SrsRtcPlayStream.