From 85e9416b025a4cdc288d8e081f8734cfd4f1e9d7 Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Wed, 10 Jul 2013 11:24:45 +0200 Subject: [PATCH] Working HLS, dunno how, but it works. --- src/buffer/player.cpp | 22 ++++------------------ src/connectors/conn_http_live.cpp | 17 ++++++++++------- src/converters/dtscfix.cpp | 6 +++--- 3 files changed, 17 insertions(+), 28 deletions(-) diff --git a/src/buffer/player.cpp b/src/buffer/player.cpp index fd8960f6..6ed5533d 100644 --- a/src/buffer/player.cpp +++ b/src/buffer/player.cpp @@ -112,13 +112,13 @@ int main(int argc, char** argv){ bool meta_sent = false; int playUntil = -1; - long long now, lastTime = 0; //for timing of sending packets + long long now = 0; //for timing of sending packets long long bench = 0; //for benchmarking std::set newSelect; Stats sts; CYG_DEFI - while (in_out.connected() && (Util::epoch() - lasttime < 60)){ + while (in_out.connected() && (Util::epoch() - lasttime < 60) && conf.is_active){ CYG_INCR if (CYG_LOOP in_out.spool()){ while (in_out.Received().size()){ @@ -170,19 +170,10 @@ int main(int argc, char** argv){ case 's': { //second-seek int ms = JSON::Value(in_out.Received().get().substr(2)).asInt(); bool ret = source.seek_time(ms); - lastTime = 0; break; } - /* - case 'f': { //frame-seek - bool ret = source.seek_frame(JSON::Value(in_out.Received().get().substr(2)).asInt()); - lastTime = 0; - break; - } - */ case 'p': { //play playing = -1; - lastTime = 0; in_out.setBlocking(false); if (in_out.Received().get().size() >= 2){ playUntil = atoi(in_out.Received().get().substr(2).c_str()); @@ -237,16 +228,11 @@ int main(int argc, char** argv){ playing = 0; } if (source.atKeyframe()){ - ///\todo Fix auto-delay on playing == -1. - if (playing == -1 && meta["video"]["keyms"].asInt() > now - lastTime){ - Util::sleep(meta["video"]["keyms"].asInt() - (now - lastTime)); - } - lastTime = now; if (playing > 0){ --playing; } } - if ( playUntil && playUntil < source.getJSON()["time"].asInt()){ + if ( playUntil && playUntil <= source.getJSON()["time"].asInt()){ playing = 0; } if (playing == 0){ @@ -254,7 +240,7 @@ int main(int argc, char** argv){ std::cerr << "Completed VoD request in MistPlayer (" << (Util::getMS() - bench) << "ms)" << std::endl; #endif pausemark["time"] = source.getJSON()["time"]; - pausemark.toPacked(); + pausemark.netPrepare(); in_out.SendNow(pausemark.toNetPacked()); in_out.setBlocking(true); }else{ diff --git a/src/connectors/conn_http_live.cpp b/src/connectors/conn_http_live.cpp index 2e44beab..1b2da183 100644 --- a/src/connectors/conn_http_live.cpp +++ b/src/connectors/conn_http_live.cpp @@ -48,7 +48,7 @@ namespace Connector_HTTP { if (audioId != -1){ bWidth += (metadata["tracks"][audioName]["maxbps"].asInt() * 2); } - result << "#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=" << bWidth * 8 << "\r\n"; + result << "#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=" << bWidth * 10 << "\r\n"; result << trackIt->second["trackid"].asInt(); if (audioId != -1){ result << "_" << audioId; @@ -66,9 +66,9 @@ namespace Connector_HTTP { } result << "#EXTM3U\r\n" "#EXT-X-TARGETDURATION:" << (longestFragment / 1000) + 1 << "\r\n" - "#EXT-X-MEDIA-SEQUENCE:" << metadata["trackid"].asInt() << "\r\n"; + "#EXT-X-MEDIA-SEQUENCE:0\r\n"; for (JSON::ArrIter ai = metadata["frags"].ArrBegin(); ai != metadata["frags"].ArrEnd(); ai++){ - result << "#EXTINF:" << (*ai)["dur"].asInt() / 1000 << ", no desc\r\n" + result << "#EXTINF:" << (((*ai)["dur"].asInt() + 500) / 1000) << ", no desc\r\n" << metadata["keys"][(*ai)["num"].asInt() - 1]["time"].asInt() << "_" << (*ai)["dur"].asInt() + metadata["keys"][(*ai)["num"].asInt() - 1]["time"].asInt() << ".ts\r\n"; } result << "#EXT-X-ENDLIST"; @@ -100,6 +100,7 @@ namespace Connector_HTTP { int ThisNaluSize; char VideoCounter = 0; char AudioCounter = 0; + long long unsigned int lastVid = 0; bool IsKeyFrame; MP4::AVCC avccbox; bool haveAvcc = false; @@ -162,6 +163,7 @@ namespace Connector_HTTP { audioTrackID = atoi(allTracks.substr(allTracks.find("_")+1).c_str()); temp = HTTP_R.url.find("/", temp) + 1; Segment = atoi(HTTP_R.url.substr(temp, HTTP_R.url.find("_", temp) - temp).c_str()); + lastVid = Segment * 90; temp = HTTP_R.url.find("_", temp) + 1; int frameCount = atoi(HTTP_R.url.substr(temp, HTTP_R.url.find(".ts", temp) - temp).c_str()); if (Strm.metadata.isMember("live")){ @@ -252,7 +254,7 @@ namespace Connector_HTTP { if (Strm.lastType() == DTSC::VIDEO || Strm.lastType() == DTSC::AUDIO){ Socket::Buffer ToPack; //write PAT and PMT TS packets - if (PacketNumber == 0){ + if (PacketNumber % 42 == 0){ PackData.DefaultPAT(); TSBuf.write(PackData.ToString(), 188); PackData.DefaultPMT(); @@ -268,7 +270,7 @@ namespace Connector_HTTP { TimeStamp = (Strm.getPacket()["time"].asInt() * 27000); } ToPack.append(avccbox.asAnnexB()); - while (Strm.lastData().size()){ + while (Strm.lastData().size() > 4){ ThisNaluSize = (Strm.lastData()[0] << 24) + (Strm.lastData()[1] << 16) + (Strm.lastData()[2] << 8) + Strm.lastData()[3]; Strm.lastData().replace(0, 4, TS::NalHeader, 4); if (ThisNaluSize + 4 == Strm.lastData().size()){ @@ -279,15 +281,16 @@ namespace Connector_HTTP { Strm.lastData().erase(0, ThisNaluSize + 4); } } - ToPack.prepend(TS::Packet::getPESVideoLeadIn(0ul, Strm.getPacket()["time"].asInt() * 90)); + ToPack.prepend(TS::Packet::getPESVideoLeadIn(0ul, Strm.getPacket()["time"].asInt() * 90)); PIDno = 0x100; ContCounter = &VideoCounter; }else if (Strm.lastType() == DTSC::AUDIO){ ToPack.append(TS::GetAudioHeader(Strm.lastData().size(), Strm.getTrackById(audioTrackID)["init"].asString())); ToPack.append(Strm.lastData()); - ToPack.prepend(TS::Packet::getPESAudioLeadIn(ToPack.bytes(1073741824ul), Strm.getPacket()["time"].asInt() * 90)); + ToPack.prepend(TS::Packet::getPESAudioLeadIn(ToPack.bytes(1073741824ul), lastVid)); PIDno = 0x101; ContCounter = &AudioCounter; + IsKeyFrame = false; } //initial packet diff --git a/src/converters/dtscfix.cpp b/src/converters/dtscfix.cpp index 4e7d1b9e..2a828db8 100644 --- a/src/converters/dtscfix.cpp +++ b/src/converters/dtscfix.cpp @@ -120,7 +120,7 @@ namespace Converters { } if( currentID == "" ) { fprintf(stderr, "Found an unknown v2 packet with id %d\n", F.getJSON()["trackid"].asInt()); - F.seekNext(); + F.parseNext(); continue; //should create new track but this shouldnt be needed... } @@ -198,13 +198,13 @@ namespace Converters { meta["tracks"][it->first]["keys"][tmp - 1]["len"] = it->second.lastms - meta["tracks"][it->first]["keys"][tmp - 2]["time"].asInt(); meta["tracks"][it->first]["keys"][tmp - 1]["size"] = it->second.totalSize; for (int i = 0; i < trackData[it->first].parts.size(); i++){ - meta["tracks"][it->first]["keys"][tmp - 1]["parts"].append(trackData[currentID].parts[i]); + meta["tracks"][it->first]["keys"][tmp - 1]["parts"].append(trackData[it->first].parts[i]); } }else{ meta["tracks"][it->first]["keys"][tmp]["len"] = it->second.lastms; meta["tracks"][it->first]["keys"][tmp]["size"] = it->second.totalSize; for (int i = 0; i < trackData[it->first].parts.size(); i++){ - meta["tracks"][it->first]["keys"][tmp]["parts"].append(trackData[currentID].parts[i]); + meta["tracks"][it->first]["keys"][tmp]["parts"].append(trackData[it->first].parts[i]); } } //calculate fragments