mirror of
https://github.com/ossrs/srs.git
synced 2025-02-13 20:01:56 +00:00
RTC: Reorder functions
This commit is contained in:
parent
9b334f91e7
commit
68de796f77
2 changed files with 92 additions and 92 deletions
|
@ -184,6 +184,76 @@ void SrsRtcConsumer::wait(int nb_msgs, srs_utime_t msgs_duration)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
SrsRtcSourceManager::SrsRtcSourceManager()
|
||||||
|
{
|
||||||
|
lock = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
SrsRtcSourceManager::~SrsRtcSourceManager()
|
||||||
|
{
|
||||||
|
srs_mutex_destroy(lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
srs_error_t SrsRtcSourceManager::fetch_or_create(SrsRequest* r, SrsRtcSource** pps)
|
||||||
|
{
|
||||||
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
// Lazy create lock, because ST is not ready in SrsRtcSourceManager constructor.
|
||||||
|
if (!lock) {
|
||||||
|
lock = srs_mutex_new();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use lock to protect coroutine switch.
|
||||||
|
// @bug https://github.com/ossrs/srs/issues/1230
|
||||||
|
SrsLocker(lock);
|
||||||
|
|
||||||
|
SrsRtcSource* source = NULL;
|
||||||
|
if ((source = fetch(r)) != NULL) {
|
||||||
|
*pps = source;
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
string stream_url = r->get_stream_url();
|
||||||
|
string vhost = r->vhost;
|
||||||
|
|
||||||
|
// should always not exists for create a source.
|
||||||
|
srs_assert (pool.find(stream_url) == pool.end());
|
||||||
|
|
||||||
|
srs_trace("new source, stream_url=%s", stream_url.c_str());
|
||||||
|
|
||||||
|
source = new SrsRtcSource();
|
||||||
|
if ((err = source->initialize(r)) != srs_success) {
|
||||||
|
return srs_error_wrap(err, "init source %s", r->get_stream_url().c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
pool[stream_url] = source;
|
||||||
|
|
||||||
|
*pps = source;
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
SrsRtcSource* SrsRtcSourceManager::fetch(SrsRequest* r)
|
||||||
|
{
|
||||||
|
SrsRtcSource* source = NULL;
|
||||||
|
|
||||||
|
string stream_url = r->get_stream_url();
|
||||||
|
if (pool.find(stream_url) == pool.end()) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
source = pool[stream_url];
|
||||||
|
|
||||||
|
// we always update the request of resource,
|
||||||
|
// for origin auth is on, the token in request maybe invalid,
|
||||||
|
// and we only need to update the token of request, it's simple.
|
||||||
|
source->update_auth(r);
|
||||||
|
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
SrsRtcSourceManager* _srs_rtc_sources = new SrsRtcSourceManager();
|
||||||
|
|
||||||
SrsRtcSource::SrsRtcSource()
|
SrsRtcSource::SrsRtcSource()
|
||||||
{
|
{
|
||||||
_source_id = _pre_source_id = -1;
|
_source_id = _pre_source_id = -1;
|
||||||
|
@ -396,76 +466,6 @@ srs_error_t SrsRtcSource::on_video_imp(SrsSharedPtrMessage* msg)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsRtcSourceManager::SrsRtcSourceManager()
|
|
||||||
{
|
|
||||||
lock = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
SrsRtcSourceManager::~SrsRtcSourceManager()
|
|
||||||
{
|
|
||||||
srs_mutex_destroy(lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
srs_error_t SrsRtcSourceManager::fetch_or_create(SrsRequest* r, SrsRtcSource** pps)
|
|
||||||
{
|
|
||||||
srs_error_t err = srs_success;
|
|
||||||
|
|
||||||
// Lazy create lock, because ST is not ready in SrsRtcSourceManager constructor.
|
|
||||||
if (!lock) {
|
|
||||||
lock = srs_mutex_new();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Use lock to protect coroutine switch.
|
|
||||||
// @bug https://github.com/ossrs/srs/issues/1230
|
|
||||||
SrsLocker(lock);
|
|
||||||
|
|
||||||
SrsRtcSource* source = NULL;
|
|
||||||
if ((source = fetch(r)) != NULL) {
|
|
||||||
*pps = source;
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
string stream_url = r->get_stream_url();
|
|
||||||
string vhost = r->vhost;
|
|
||||||
|
|
||||||
// should always not exists for create a source.
|
|
||||||
srs_assert (pool.find(stream_url) == pool.end());
|
|
||||||
|
|
||||||
srs_trace("new source, stream_url=%s", stream_url.c_str());
|
|
||||||
|
|
||||||
source = new SrsRtcSource();
|
|
||||||
if ((err = source->initialize(r)) != srs_success) {
|
|
||||||
return srs_error_wrap(err, "init source %s", r->get_stream_url().c_str());
|
|
||||||
}
|
|
||||||
|
|
||||||
pool[stream_url] = source;
|
|
||||||
|
|
||||||
*pps = source;
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
SrsRtcSource* SrsRtcSourceManager::fetch(SrsRequest* r)
|
|
||||||
{
|
|
||||||
SrsRtcSource* source = NULL;
|
|
||||||
|
|
||||||
string stream_url = r->get_stream_url();
|
|
||||||
if (pool.find(stream_url) == pool.end()) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
source = pool[stream_url];
|
|
||||||
|
|
||||||
// we always update the request of resource,
|
|
||||||
// for origin auth is on, the token in request maybe invalid,
|
|
||||||
// and we only need to update the token of request, it's simple.
|
|
||||||
source->update_auth(r);
|
|
||||||
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
SrsRtcSourceManager* _srs_rtc_sources = new SrsRtcSourceManager();
|
|
||||||
|
|
||||||
SrsRtcFromRtmpBridger::SrsRtcFromRtmpBridger(SrsRtcSource* source)
|
SrsRtcFromRtmpBridger::SrsRtcFromRtmpBridger(SrsRtcSource* source)
|
||||||
{
|
{
|
||||||
req = NULL;
|
req = NULL;
|
||||||
|
|
|
@ -84,6 +84,28 @@ public:
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class SrsRtcSourceManager
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
srs_mutex_t lock;
|
||||||
|
std::map<std::string, SrsRtcSource*> pool;
|
||||||
|
public:
|
||||||
|
SrsRtcSourceManager();
|
||||||
|
virtual ~SrsRtcSourceManager();
|
||||||
|
public:
|
||||||
|
// create source when fetch from cache failed.
|
||||||
|
// @param r the client request.
|
||||||
|
// @param pps the matched source, if success never be NULL.
|
||||||
|
virtual srs_error_t fetch_or_create(SrsRequest* r, SrsRtcSource** pps);
|
||||||
|
private:
|
||||||
|
// Get the exists source, NULL when not exists.
|
||||||
|
// update the request and return the exists source.
|
||||||
|
virtual SrsRtcSource* fetch(SrsRequest* r);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Global singleton instance.
|
||||||
|
extern SrsRtcSourceManager* _srs_rtc_sources;
|
||||||
|
|
||||||
class SrsRtcSource
|
class SrsRtcSource
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
@ -145,28 +167,6 @@ public:
|
||||||
virtual srs_error_t on_video_imp(SrsSharedPtrMessage* video);
|
virtual srs_error_t on_video_imp(SrsSharedPtrMessage* video);
|
||||||
};
|
};
|
||||||
|
|
||||||
class SrsRtcSourceManager
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
srs_mutex_t lock;
|
|
||||||
std::map<std::string, SrsRtcSource*> pool;
|
|
||||||
public:
|
|
||||||
SrsRtcSourceManager();
|
|
||||||
virtual ~SrsRtcSourceManager();
|
|
||||||
public:
|
|
||||||
// create source when fetch from cache failed.
|
|
||||||
// @param r the client request.
|
|
||||||
// @param pps the matched source, if success never be NULL.
|
|
||||||
virtual srs_error_t fetch_or_create(SrsRequest* r, SrsRtcSource** pps);
|
|
||||||
private:
|
|
||||||
// Get the exists source, NULL when not exists.
|
|
||||||
// update the request and return the exists source.
|
|
||||||
virtual SrsRtcSource* fetch(SrsRequest* r);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Global singleton instance.
|
|
||||||
extern SrsRtcSourceManager* _srs_rtc_sources;
|
|
||||||
|
|
||||||
class SrsRtcFromRtmpBridger : public ISrsSourceBridger
|
class SrsRtcFromRtmpBridger : public ISrsSourceBridger
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
Loading…
Reference in a new issue