From a7edacd7201021acb9b9e7042bad2f4c176dd271 Mon Sep 17 00:00:00 2001 From: Erik Zandvliet Date: Mon, 27 May 2013 13:47:44 +0200 Subject: [PATCH] Various updates --- src/buffer/player.cpp | 2 + src/connectors/conn_http_progressive.cpp | 49 +++++++++++++++++------- src/connectors/conn_http_smooth.cpp | 4 +- src/converters/dtscfix.cpp | 6 +++ 4 files changed, 46 insertions(+), 15 deletions(-) diff --git a/src/buffer/player.cpp b/src/buffer/player.cpp index 04439c4f..e7093911 100644 --- a/src/buffer/player.cpp +++ b/src/buffer/player.cpp @@ -173,11 +173,13 @@ int main(int argc, char** argv){ 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; diff --git a/src/connectors/conn_http_progressive.cpp b/src/connectors/conn_http_progressive.cpp index 6fc3a02f..e44e642e 100644 --- a/src/connectors/conn_http_progressive.cpp +++ b/src/connectors/conn_http_progressive.cpp @@ -42,6 +42,11 @@ namespace Connector_HTTP { unsigned int seek_byte = 0;//Seek position in bytes bool isMP3 = false;//Indicates whether the request is audio-only mp3. + + std::string videoName; + int videoID = -1; + std::string audioName; + int audioID = -1; while (conn.connected()){ //Only attempt to parse input when not yet init'ed. @@ -123,19 +128,36 @@ namespace Connector_HTTP { } } int byterate = 0; - if (Strm.metadata.isMember("video") && !isMP3){ - byterate += Strm.metadata["video"]["bps"].asInt(); + for (JSON::ObjIter objIt = Strm.metadata["tracks"].ObjBegin(); objIt != Strm.metadata["tracks"].ObjEnd(); objIt++){ + if (videoID == -1 && objIt->second["type"].asString() == "video"){ + videoID = objIt->second["trackid"].asInt(); + videoName = objIt->first; + } + if (audioID == -1 && objIt->second["type"].asString() == "audio"){ + audioID = objIt->second["trackid"].asInt(); + audioName = objIt->first; + } } - if (Strm.metadata.isMember("audio")){ - byterate += Strm.metadata["audio"]["bps"].asInt(); + if (videoID != -1 && !isMP3){ + byterate += Strm.metadata["tracks"][videoName]["bps"].asInt(); + } + if (audioID != -1){ + byterate += Strm.metadata["tracks"][audioName]["bps"].asInt(); } seek_sec = (seek_byte / byterate) * 1000; } - if (seek_sec){ - std::stringstream cmd; - cmd << "s " << seek_sec << "\n"; - ss.SendNow(cmd.str().c_str()); + std::stringstream cmd; + cmd << "t"; + if (videoID != -1){ + cmd << " " << videoID; } + if (audioID != -1){ + cmd << " " << audioID; + } + ss.SendNow(cmd.str().c_str()); + cmd.str() = ""; + cmd << "s " << seek_sec << "\n"; + ss.SendNow(cmd.str().c_str()); ss.SendNow("p\n"); inited = true; } @@ -144,6 +166,7 @@ namespace Connector_HTTP { lastStats = now; ss.SendNow(conn.getStats("HTTP_Progressive").c_str()); } + ///\todo UPDATE THIS TO DTSCv2 too if (ss.spool()){ while (Strm.parsePacket(ss.Received())){ if ( !progressive_has_sent_header){ @@ -159,16 +182,16 @@ namespace Connector_HTTP { if ( !isMP3){ conn.SendNow(FLV::Header, 13); //write FLV header //write metadata - tag.DTSCMetaInit(Strm); + tag.DTSCMetaInit(Strm,videoName, audioName); conn.SendNow(tag.data, tag.len); //write video init data, if needed - if (Strm.metadata.isMember("video") && Strm.metadata["video"].isMember("init")){ - tag.DTSCVideoInit(Strm); + if (videoID != -1 && Strm.metadata["video"].isMember("init")){ + tag.DTSCVideoInit(Strm.metadata["tracks"][videoName]); conn.SendNow(tag.data, tag.len); } //write audio init data, if needed - if (Strm.metadata.isMember("audio") && Strm.metadata["audio"].isMember("init")){ - tag.DTSCAudioInit(Strm); + if (audioID != -1 && Strm.metadata["audio"].isMember("init")){ + tag.DTSCAudioInit(Strm.metadata["tracks"][audioName]); conn.SendNow(tag.data, tag.len); } } diff --git a/src/connectors/conn_http_smooth.cpp b/src/connectors/conn_http_smooth.cpp index d39cc446..1cfc623e 100644 --- a/src/connectors/conn_http_smooth.cpp +++ b/src/connectors/conn_http_smooth.cpp @@ -274,10 +274,10 @@ namespace Connector_HTTP { //Seek to the right place and send a play-once for a single fragment. std::stringstream sstream; if (wantsVideo){ - sstream << "t " << allVideo.ObjBegin()->first << "\n"; + sstream << "t " << allVideo.ObjBegin()->second["trackid"].asInt() << "\n"; } if (wantsAudio){ - sstream << "t " << allAudio.ObjBegin()->first << "\n"; + sstream << "t " << allAudio.ObjBegin()->second["trackid"].asInt() << "\n"; } sstream << "s " << (requestedTime / 10000) << "\no \n"; ss.SendNow(sstream.str().c_str()); diff --git a/src/converters/dtscfix.cpp b/src/converters/dtscfix.cpp index 2b05b055..87f63c87 100644 --- a/src/converters/dtscfix.cpp +++ b/src/converters/dtscfix.cpp @@ -61,7 +61,10 @@ namespace Converters { std::string currentID; int nextFreeID = 0; + std::set tmp; + for (JSON::ObjIter it = meta["tracks"].ObjBegin(); it != meta["tracks"].ObjEnd(); it++){ + tmp.insert(it->second["trackid"].asInt()); trackIDs.insert(std::pair(it->first,it->second["trackid"].asInt())); trackData[it->first].type = it->second["type"].asString(); trackData[it->first].trackID = it->second["trackid"].asInt(); @@ -70,6 +73,9 @@ namespace Converters { } } + F.selectTracks(tmp); + F.seek_time(0); + F.seekNext(); while ( !F.getJSON().isNull()){ currentID = "";