From 4963aac94172469c61ebfa8f2152fced577ff472 Mon Sep 17 00:00:00 2001 From: Thulinma Date: Tue, 11 Oct 2016 15:09:19 +0200 Subject: [PATCH] Updated DTSC analyser in compact mode to be more accurate and detect possible HLS-related issues, compact mode no longer a Pro-only feature. --- src/analysers/dtsc_analyser.cpp | 52 +++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/analysers/dtsc_analyser.cpp b/src/analysers/dtsc_analyser.cpp index c7fd822a..63176fdc 100644 --- a/src/analysers/dtsc_analyser.cpp +++ b/src/analysers/dtsc_analyser.cpp @@ -24,6 +24,58 @@ namespace Analysers { return 1; } + if (conf.getBool("compact")){ + bool hasH264 = false; + bool hasAAC = false; + bool unstable_keys = false; + bool unstable_parts = false; + JSON::Value result; + std::stringstream issues; + for (std::map::iterator it = F.getMeta().tracks.begin(); it != F.getMeta().tracks.end(); it++){ + JSON::Value track; + track["kbits"] = (long long)((double)it->second.bps * 8 / 1024); + track["codec"] = it->second.codec; + uint32_t shrtest_key = 0xFFFFFFFFul; + uint32_t longest_key = 0; + uint32_t shrtest_prt = 0xFFFFFFFFul; + uint32_t longest_prt = 0; + uint32_t shrtest_cnt = 0xFFFFFFFFul; + uint32_t longest_cnt = 0; + for (std::deque::iterator k = it->second.keys.begin(); k != it->second.keys.end(); k++){ + if (!k->getLength()){continue;} + if (k->getLength() > longest_key){longest_key = k->getLength();} + if (k->getLength() < shrtest_key){shrtest_key = k->getLength();} + if (k->getParts() > longest_cnt){longest_cnt = k->getParts();} + if (k->getParts() < shrtest_cnt){shrtest_cnt = k->getParts();} + if ((k->getLength()/k->getParts()) > longest_prt){longest_prt = (k->getLength()/k->getParts());} + if ((k->getLength()/k->getParts()) < shrtest_prt){shrtest_prt = (k->getLength()/k->getParts());} + } + track["keys"]["min"] = (long long)shrtest_key; + track["keys"]["max"] = (long long)longest_key; + track["prts"]["min"] = (long long)shrtest_prt; + track["prts"]["max"] = (long long)longest_prt; + track["count"]["min"] = (long long)shrtest_cnt; + track["count"]["max"] = (long long)longest_cnt; + if (shrtest_key < longest_key / 2){issues << it->second.codec << " key duration unstable (variable key interval!) (" << shrtest_key << "-" << longest_key << ")! ";} + if ((shrtest_prt < longest_prt / 2) && (shrtest_cnt != longest_cnt)){issues << it->second.codec << " part duration unstable (bad connection!) (" << shrtest_prt << "-" << longest_prt << ")! ";} + if (it->second.codec == "AAC"){hasAAC = true;} + if (it->second.codec == "H264"){hasH264 = true;} + if (it->second.type=="video"){ + track["width"] = (long long)it->second.width; + track["height"] = (long long)it->second.height; + track["fpks"] = it->second.fpks; + } + result[it->second.getWritableIdentifier()] = track; + } + if (hasAAC || hasH264){ + if (!hasAAC){issues << "video-only! ";} + if (!hasH264){issues << "audio-only! ";} + } + if (issues.str().size()){result["issues"] = issues.str();} + std::cout << result.toString(); + return 0; + } + if (F.getMeta().vod || F.getMeta().live){ F.getMeta().toPrettyString(std::cout,0, 0x03); }