|
|
|
@ -97,11 +97,17 @@ void SrsIngesterFFMPEG::fast_stop()
|
|
|
|
|
ffmpeg->fast_stop();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SrsIngesterFFMPEG::fast_kill()
|
|
|
|
|
{
|
|
|
|
|
ffmpeg->fast_kill();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SrsIngester::SrsIngester()
|
|
|
|
|
{
|
|
|
|
|
_srs_config->subscribe(this);
|
|
|
|
|
|
|
|
|
|
expired = false;
|
|
|
|
|
disposed = false;
|
|
|
|
|
|
|
|
|
|
trd = new SrsDummyCoroutine();
|
|
|
|
|
pprint = SrsPithyPrint::create_ingester();
|
|
|
|
@ -117,11 +123,18 @@ SrsIngester::~SrsIngester()
|
|
|
|
|
|
|
|
|
|
void SrsIngester::dispose()
|
|
|
|
|
{
|
|
|
|
|
if (disposed) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
disposed = true;
|
|
|
|
|
|
|
|
|
|
// first, use fast stop to notice all FFMPEG to quit gracefully.
|
|
|
|
|
fast_stop();
|
|
|
|
|
|
|
|
|
|
// then, use stop to wait FFMPEG quit one by one and send SIGKILL if needed.
|
|
|
|
|
stop();
|
|
|
|
|
srs_usleep(100 * SRS_UTIME_MILLISECONDS);
|
|
|
|
|
|
|
|
|
|
// then, use fast kill to ensure FFMPEG quit.
|
|
|
|
|
fast_kill();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
srs_error_t SrsIngester::start()
|
|
|
|
@ -166,6 +179,19 @@ void SrsIngester::fast_stop()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void SrsIngester::fast_kill()
|
|
|
|
|
{
|
|
|
|
|
std::vector<SrsIngesterFFMPEG*>::iterator it;
|
|
|
|
|
for (it = ingesters.begin(); it != ingesters.end(); ++it) {
|
|
|
|
|
SrsIngesterFFMPEG* ingester = *it;
|
|
|
|
|
ingester->fast_kill();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ingesters.empty()) {
|
|
|
|
|
srs_trace("fast kill all ingesters ok.");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// when error, ingester sleep for a while and retry.
|
|
|
|
|
// ingest never sleep a long time, for we must start the stream ASAP.
|
|
|
|
|
#define SRS_AUTO_INGESTER_CIMS (3 * SRS_UTIME_SECONDS)
|
|
|
|
@ -174,7 +200,7 @@ srs_error_t SrsIngester::cycle()
|
|
|
|
|
{
|
|
|
|
|
srs_error_t err = srs_success;
|
|
|
|
|
|
|
|
|
|
while (true) {
|
|
|
|
|
while (!disposed) {
|
|
|
|
|
if ((err = do_cycle()) != srs_success) {
|
|
|
|
|
srs_warn("Ingester: Ignore error, %s", srs_error_desc(err).c_str());
|
|
|
|
|
srs_freep(err);
|
|
|
|
|