mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
RTC: Support WebRTC re-publish stream. 4.0.87
This commit is contained in:
parent
0cb05a2953
commit
d6c16a7e23
6 changed files with 95 additions and 20 deletions
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue