1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

SquashSRS4: Support WebRTC re-publish stream.

This commit is contained in:
winlin 2021-03-26 14:59:25 +08:00
parent aab54b2cf4
commit 4692e8b8ad
6 changed files with 95 additions and 20 deletions

View file

@ -152,10 +152,19 @@ SrsNtp SrsNtp::to_time_ms(uint64_t ntp)
return srs_ntp;
}
ISrsRtcStreamChangeCallback::ISrsRtcStreamChangeCallback()
{
}
ISrsRtcStreamChangeCallback::~ISrsRtcStreamChangeCallback()
{
}
SrsRtcConsumer::SrsRtcConsumer(SrsRtcStream* s)
{
source = s;
should_update_source_id = false;
handler_ = NULL;
mw_wait = srs_cond_new();
mw_min_msgs = 0;
@ -231,6 +240,13 @@ void SrsRtcConsumer::wait(int nb_msgs)
srs_cond_wait(mw_wait);
}
void SrsRtcConsumer::on_stream_change(SrsRtcStreamDescription* desc)
{
if (handler_) {
handler_->on_stream_change(desc);
}
}
SrsRtcStreamManager::SrsRtcStreamManager()
{
lock = NULL;
@ -354,24 +370,34 @@ void SrsRtcStream::update_auth(SrsRequest* r)
req->update_auth(r);
}
srs_error_t SrsRtcStream::on_source_id_changed(SrsContextId id)
srs_error_t SrsRtcStream::on_source_changed()
{
srs_error_t err = srs_success;
if (!_source_id.compare(id)) {
return err;
// Update context id if changed.
bool id_changed = false;
const SrsContextId& id = _srs_context->get_id();
if (_source_id.compare(id)) {
id_changed = true;
if (_pre_source_id.empty()) {
_pre_source_id = id;
}
_source_id = id;
}
if (_pre_source_id.empty()) {
_pre_source_id = id;
}
_source_id = id;
// notice all consumer
// Notify all consumers.
std::vector<SrsRtcConsumer*>::iterator it;
for (it = consumers.begin(); it != consumers.end(); ++it) {
SrsRtcConsumer* consumer = *it;
consumer->update_source_id();
// Notify if context id changed.
if (id_changed) {
consumer->update_source_id();
}
// Notify about stream description.
consumer->on_stream_change(stream_desc_);
}
return err;
@ -456,9 +482,8 @@ srs_error_t SrsRtcStream::on_publish()
is_created_ = true;
is_delivering_packets_ = true;
// whatever, the publish thread is the source or edge source,
// save its id to srouce id.
if ((err = on_source_id_changed(_srs_context->get_id())) != srs_success) {
// Notify the consumers about stream change event.
if ((err = on_source_changed()) != srs_success) {
return srs_error_wrap(err, "source id change");
}