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

refine the pithy print of ingesters.

This commit is contained in:
winlin 2015-06-06 18:57:41 +08:00
parent e4c27a51b8
commit 2a1db36750
2 changed files with 94 additions and 24 deletions

View file

@ -39,11 +39,9 @@ using namespace std;
// ingest never sleep a long time, for we must start the stream ASAP. // ingest never sleep a long time, for we must start the stream ASAP.
#define SRS_AUTO_INGESTER_SLEEP_US (int64_t)(3*1000*1000LL) #define SRS_AUTO_INGESTER_SLEEP_US (int64_t)(3*1000*1000LL)
SrsIngesterFFMPEG::SrsIngesterFFMPEG(SrsFFMPEG* _ffmpeg, string _vhost, string _id) SrsIngesterFFMPEG::SrsIngesterFFMPEG()
{ {
ffmpeg = _ffmpeg; ffmpeg = NULL;
vhost = _vhost;
id = _id;
} }
SrsIngesterFFMPEG::~SrsIngesterFFMPEG() SrsIngesterFFMPEG::~SrsIngesterFFMPEG()
@ -51,6 +49,53 @@ SrsIngesterFFMPEG::~SrsIngesterFFMPEG()
srs_freep(ffmpeg); srs_freep(ffmpeg);
} }
int SrsIngesterFFMPEG::initialize(SrsFFMPEG* ff, string v, string i)
{
int ret = ERROR_SUCCESS;
ffmpeg = ff;
vhost = v;
id = i;
starttime = srs_get_system_time_ms();
return ret;
}
string SrsIngesterFFMPEG::uri()
{
return vhost + "/" + id;
}
int SrsIngesterFFMPEG::alive()
{
return (int)(srs_get_system_time_ms() - starttime);
}
bool SrsIngesterFFMPEG::equals(string v)
{
return vhost == v;
}
bool SrsIngesterFFMPEG::equals(string v, string i)
{
return vhost == v && id == i;
}
int SrsIngesterFFMPEG::start()
{
return ffmpeg->start();
}
void SrsIngesterFFMPEG::stop()
{
ffmpeg->stop();
}
int SrsIngesterFFMPEG::cycle()
{
return ffmpeg->cycle();
}
void SrsIngesterFFMPEG::fast_stop() void SrsIngesterFFMPEG::fast_stop()
{ {
ffmpeg->fast_stop(); ffmpeg->fast_stop();
@ -129,6 +174,8 @@ int SrsIngester::parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest
// get all engines. // get all engines.
std::vector<SrsConfDirective*> engines = _srs_config->get_transcode_engines(ingest); std::vector<SrsConfDirective*> engines = _srs_config->get_transcode_engines(ingest);
// create ingesters without engines.
if (engines.empty()) { if (engines.empty()) {
SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin); SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin);
if ((ret = initialize_ffmpeg(ffmpeg, vhost, ingest, NULL)) != ERROR_SUCCESS) { if ((ret = initialize_ffmpeg(ffmpeg, vhost, ingest, NULL)) != ERROR_SUCCESS) {
@ -139,12 +186,17 @@ int SrsIngester::parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest
return ret; return ret;
} }
SrsIngesterFFMPEG* ingester = new SrsIngesterFFMPEG(ffmpeg, vhost->arg0(), ingest->arg0()); SrsIngesterFFMPEG* ingester = new SrsIngesterFFMPEG();
if ((ret = ingester->initialize(ffmpeg, vhost->arg0(), ingest->arg0())) != ERROR_SUCCESS) {
srs_freep(ingester);
return ret;
}
ingesters.push_back(ingester); ingesters.push_back(ingester);
return ret; return ret;
} }
// create engine // create ingesters with engine
for (int i = 0; i < (int)engines.size(); i++) { for (int i = 0; i < (int)engines.size(); i++) {
SrsConfDirective* engine = engines[i]; SrsConfDirective* engine = engines[i];
SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin); SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin);
@ -156,8 +208,13 @@ int SrsIngester::parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest
} }
return ret; return ret;
} }
SrsIngesterFFMPEG* ingester = new SrsIngesterFFMPEG();
if ((ret = ingester->initialize(ffmpeg, vhost->arg0(), ingest->arg0())) != ERROR_SUCCESS) {
srs_freep(ingester);
return ret;
}
SrsIngesterFFMPEG* ingester = new SrsIngesterFFMPEG(ffmpeg, vhost->arg0(), ingest->arg0());
ingesters.push_back(ingester); ingesters.push_back(ingester);
} }
@ -196,13 +253,13 @@ int SrsIngester::cycle()
SrsIngesterFFMPEG* ingester = *it; SrsIngesterFFMPEG* ingester = *it;
// start all ffmpegs. // start all ffmpegs.
if ((ret = ingester->ffmpeg->start()) != ERROR_SUCCESS) { if ((ret = ingester->start()) != ERROR_SUCCESS) {
srs_error("ingest ffmpeg start failed. ret=%d", ret); srs_error("ingest ffmpeg start failed. ret=%d", ret);
return ret; return ret;
} }
// check ffmpeg status. // check ffmpeg status.
if ((ret = ingester->ffmpeg->cycle()) != ERROR_SUCCESS) { if ((ret = ingester->cycle()) != ERROR_SUCCESS) {
srs_error("ingest ffmpeg cycle failed. ret=%d", ret); srs_error("ingest ffmpeg cycle failed. ret=%d", ret);
return ret; return ret;
} }
@ -376,11 +433,14 @@ void SrsIngester::show_ingest_log_message()
return; return;
} }
// random choose one ingester to report.
int index = rand() % (int)ingesters.size();
SrsIngesterFFMPEG* ingester = ingesters.at(index);
// reportable // reportable
if (pprint->can_print()) { if (pprint->can_print()) {
// TODO: FIXME: show more info. srs_trace("-> "SRS_CONSTS_LOG_INGESTER" time=%"PRId64", ingesters=%d, #%d(alive=%ds, %s)",
srs_trace("-> "SRS_CONSTS_LOG_INGESTER pprint->age(), (int)ingesters.size(), index, ingester->alive() / 1000, ingester->uri().c_str());
" time=%"PRId64", ingesters=%d", pprint->age(), (int)ingesters.size());
} }
} }
@ -407,16 +467,15 @@ int SrsIngester::on_reload_vhost_removed(string vhost)
for (it = ingesters.begin(); it != ingesters.end();) { for (it = ingesters.begin(); it != ingesters.end();) {
SrsIngesterFFMPEG* ingester = *it; SrsIngesterFFMPEG* ingester = *it;
if (ingester->vhost != vhost) { if (!ingester->equals(vhost)) {
++it; ++it;
continue; continue;
} }
// stop the ffmpeg and free it. // stop the ffmpeg and free it.
ingester->ffmpeg->stop(); ingester->stop();
srs_trace("reload stop ingester, " srs_trace("reload stop ingester, vhost=%s, id=%s", vhost.c_str(), ingester->uri().c_str());
"vhost=%s, id=%s", vhost.c_str(), ingester->id.c_str());
srs_freep(ingester); srs_freep(ingester);
@ -436,16 +495,15 @@ int SrsIngester::on_reload_ingest_removed(string vhost, string ingest_id)
for (it = ingesters.begin(); it != ingesters.end();) { for (it = ingesters.begin(); it != ingesters.end();) {
SrsIngesterFFMPEG* ingester = *it; SrsIngesterFFMPEG* ingester = *it;
if (ingester->vhost != vhost || ingester->id != ingest_id) { if (!ingester->equals(vhost, ingest_id)) {
++it; ++it;
continue; continue;
} }
// stop the ffmpeg and free it. // stop the ffmpeg and free it.
ingester->ffmpeg->stop(); ingester->stop();
srs_trace("reload stop ingester, " srs_trace("reload stop ingester, vhost=%s, id=%s", vhost.c_str(), ingester->uri().c_str());
"vhost=%s, id=%s", vhost.c_str(), ingester->id.c_str());
srs_freep(ingester); srs_freep(ingester);

View file

@ -45,14 +45,26 @@ class SrsPithyPrint;
*/ */
class SrsIngesterFFMPEG class SrsIngesterFFMPEG
{ {
public: private:
std::string vhost; std::string vhost;
std::string id; std::string id;
SrsFFMPEG* ffmpeg; SrsFFMPEG* ffmpeg;
int64_t starttime;
SrsIngesterFFMPEG(SrsFFMPEG* _ffmpeg, std::string _vhost, std::string _id); public:
SrsIngesterFFMPEG();
virtual ~SrsIngesterFFMPEG(); virtual ~SrsIngesterFFMPEG();
public:
virtual int initialize(SrsFFMPEG* ff, std::string v, std::string i);
// the ingest uri, [vhost]/[ingest id]
virtual std::string uri();
// the alive in ms.
virtual int alive();
virtual bool equals(std::string v, std::string i);
virtual bool equals(std::string v);
public:
virtual int start();
virtual void stop();
virtual int cycle();
// @see SrsFFMPEG.fast_stop(). // @see SrsFFMPEG.fast_stop().
virtual void fast_stop(); virtual void fast_stop();
}; };