From 2730aee68219861d771c6d000dba8119695d88ef Mon Sep 17 00:00:00 2001 From: Thulinma Date: Sun, 24 Mar 2013 20:18:00 +0100 Subject: [PATCH] Fixed buffer not properly allowing push source to restart an ongoing broadcast. --- lib/dtsc.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/dtsc.cpp b/lib/dtsc.cpp index 23eb9b53..e4eda4db 100644 --- a/lib/dtsc.cpp +++ b/lib/dtsc.cpp @@ -312,15 +312,32 @@ void DTSC::Stream::dropRing(DTSC::Ring * ptr){ /// time than right after receiving a new keyframe, or there'll be raptors. void DTSC::Stream::updateHeaders(){ if (keyframes.size() > 2){ + if (buffers[keyframes[0].b]["time"].asInt() < buffers[keyframes[keyframes.size() - 1].b]["time"].asInt()){ + std::cerr << "Detected new video - resetting all buffers and metadata - hold on, this ride might get bumpy!" << std::endl; + keyframes.clear(); + buffers.clear(); + std::set::iterator sit; + if ( !rings.size()){ + return; + } + for (sit = rings.begin(); sit != rings.end(); sit++){ + ( *sit)->updated = true; + ( *sit)->b = 0; + ( *sit)->starved = true; + } + metadata.removeMember("keytime"); + metadata.removeMember("keynum"); + metadata.removeMember("keylen"); + metadata.removeMember("frags"); + metadata.removeMember("lastms"); + metadata.removeMember("missed_frags"); + return; + } metadata["keytime"].shrink(keyframes.size() - 2); metadata["keynum"].shrink(keyframes.size() - 2); metadata["keylen"].shrink(keyframes.size() - 2); metadata["keytime"].append(buffers[keyframes[1].b]["time"].asInt()); - if (metadata["keynum"].size() == 0){ - metadata["keynum"].append(1ll); - }else{ - metadata["keynum"].append(metadata["keynum"][metadata["keynum"].size() - 1].asInt() + 1); - } + metadata["keynum"].append(buffers[keyframes[1].b]["fragnum"].asInt()); metadata["keylen"].append(buffers[keyframes[0].b]["time"].asInt() - buffers[keyframes[1].b]["time"].asInt()); long long int firstFragNo = -1; metadata["frags"].null();