From cba0c0b38bfe6247f6fc48d5c2831b4a826046a1 Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Wed, 4 Oct 2017 11:12:30 +0200 Subject: [PATCH] Calculate both average and peak bit rates --- lib/dtsc.h | 1 + lib/dtscmeta.cpp | 22 ++++++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/dtsc.h b/lib/dtsc.h index 6f5f7317..53f3f465 100644 --- a/lib/dtsc.h +++ b/lib/dtsc.h @@ -292,6 +292,7 @@ namespace DTSC { unsigned long long firstms; unsigned long long lastms; int bps; + int max_bps; int missedFrags; std::string init; std::string codec; diff --git a/lib/dtscmeta.cpp b/lib/dtscmeta.cpp index 3e212e6a..5f45278a 100644 --- a/lib/dtscmeta.cpp +++ b/lib/dtscmeta.cpp @@ -1098,6 +1098,7 @@ namespace DTSC { firstms = 0; lastms = 0; bps = 0; + max_bps = 0; missedFrags = 0; rate = 0; size = 0; @@ -1126,6 +1127,7 @@ namespace DTSC { firstms = trackRef["firstms"].asInt(); lastms = trackRef["lastms"].asInt(); bps = trackRef["bps"].asInt(); + max_bps = trackRef["maxbps"].asInt(); missedFrags = trackRef["missed_frags"].asInt(); codec = trackRef["codec"].asStringRef(); type = trackRef["type"].asStringRef(); @@ -1180,6 +1182,7 @@ namespace DTSC { firstms = trackRef.getMember("firstms").asInt(); lastms = trackRef.getMember("lastms").asInt(); bps = trackRef.getMember("bps").asInt(); + max_bps = trackRef.getMember("maxbps").asInt(); missedFrags = trackRef.getMember("missed_frags").asInt(); codec = trackRef.getMember("codec").asString(); type = trackRef.getMember("type").asString(); @@ -1263,10 +1266,14 @@ namespace DTSC { newFrag.setNumber(keys[keys.size() - 1].getNumber()); if (fragments.size()) { fragments[fragments.size() - 1].setDuration(packTime - getKey(fragments[fragments.size() - 1].getNumber()).getTime()); - unsigned int newBps = (fragments[fragments.size() - 1].getSize() * 1000) / fragments[fragments.size() - 1].getDuration(); - if (newBps > bps){ - bps = newBps; + uint64_t totalBytes = 0; + uint64_t totalDuration = 0; + for (std::deque::iterator it = fragments.begin(); it != fragments.end(); it++){ + totalBytes += it->getSize(); + totalDuration += it->getDuration(); } + bps = totalDuration ? (totalBytes * 1000) / totalDuration : 0; + max_bps = std::max(max_bps, (int)((fragments.rbegin()->getSize() * 1000) / fragments.rbegin()->getDuration())); } newFrag.setDuration(0); newFrag.setSize(0); @@ -1377,6 +1384,7 @@ namespace DTSC { keySizes.clear(); keys.clear(); bps = 0; + max_bps = 0; firstms = 0; lastms = 0; } @@ -1517,6 +1525,7 @@ namespace DTSC { str << std::string(indent + 2, ' ') << "Firstms: " << firstms << std::endl; str << std::string(indent + 2, ' ') << "Lastms: " << lastms << std::endl; str << std::string(indent + 2, ' ') << "Bps: " << bps << std::endl; + str << std::string(indent + 2, ' ') << "Peak bps: " << max_bps << std::endl; if (missedFrags) { str << std::string(indent + 2, ' ') << "missedFrags: " << missedFrags << std::endl; } @@ -1632,7 +1641,7 @@ namespace DTSC { ///\brief Determines the "packed" size of a track int Track::getSendLen(bool skipDynamic) { - int result = 107 + init.size() + codec.size() + type.size() + getWritableIdentifier().size(); + int result = 124 + init.size() + codec.size() + type.size() + getWritableIdentifier().size(); if (!skipDynamic){ result += fragments.size() * PACKED_FRAGMENT_SIZE + 16; result += keys.size() * PACKED_KEY_SIZE + 11; @@ -1721,6 +1730,8 @@ namespace DTSC { writePointer(p, convertLongLong(lastms), 8); writePointer(p, "\000\003bps\001", 6); writePointer(p, convertLongLong(bps), 8); + writePointer(p, "\000\006maxbps\001", 9); + writePointer(p, convertLongLong(max_bps), 8); writePointer(p, "\000\004init\002", 7); writePointer(p, convertInt(init.size()), 4); writePointer(p, init); @@ -1802,6 +1813,8 @@ namespace DTSC { conn.SendNow(convertLongLong(lastms), 8); conn.SendNow("\000\003bps\001", 6); conn.SendNow(convertLongLong(bps), 8); + conn.SendNow("\000\006maxbps\001", 9); + conn.SendNow(convertLongLong(max_bps), 8); conn.SendNow("\000\004init\002", 7); conn.SendNow(convertInt(init.size()), 4); conn.SendNow(init); @@ -1973,6 +1986,7 @@ namespace DTSC { result["firstms"] = (long long)firstms; result["lastms"] = (long long)lastms; result["bps"] = bps; + result["maxbps"] = max_bps; if (missedFrags) { result["missed_frags"] = missedFrags; }