General fixes for HTTP Smooth
This commit is contained in:
parent
eca085cc49
commit
4e6567cf24
1 changed files with 24 additions and 35 deletions
|
@ -249,24 +249,8 @@ namespace Connector_HTTP {
|
||||||
}
|
}
|
||||||
parseString = parseString.substr(parseString.find("(") + 1);
|
parseString = parseString.substr(parseString.find("(") + 1);
|
||||||
requestedTime = atoll(parseString.substr(0, parseString.find(")")).c_str());
|
requestedTime = atoll(parseString.substr(0, parseString.find(")")).c_str());
|
||||||
JSON::Value myRef;
|
|
||||||
long long int selectedQuality = atoll(Quality.c_str());
|
long long int selectedQuality = atoll(Quality.c_str());
|
||||||
if (wantsVideo){
|
JSON::Value & myRef = Strm.getTrackById(selectedQuality);
|
||||||
//Select the correct track ID
|
|
||||||
for (JSON::ObjIter vIt = allVideo.ObjBegin(); vIt != allVideo.ObjEnd(); vIt++){
|
|
||||||
if (vIt->second["trackid"].asInt() == selectedQuality){
|
|
||||||
myRef = vIt->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (wantsAudio){
|
|
||||||
//Select the correct track ID
|
|
||||||
for (JSON::ObjIter aIt = allAudio.ObjBegin(); aIt != allAudio.ObjEnd(); aIt++){
|
|
||||||
if (aIt->second["trackid"].asInt() == selectedQuality){
|
|
||||||
myRef = aIt->second;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (Strm.metadata.isMember("live")){
|
if (Strm.metadata.isMember("live")){
|
||||||
int seekable = Strm.canSeekms(requestedTime / 10000);
|
int seekable = Strm.canSeekms(requestedTime / 10000);
|
||||||
if (seekable == 0){
|
if (seekable == 0){
|
||||||
|
@ -332,17 +316,7 @@ namespace Connector_HTTP {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//Obtain the corresponding track;
|
||||||
sstream << "t " << myRef["trackid"].asInt() << "\n";
|
|
||||||
sstream << "s " << (requestedTime / 10000) << "\n";
|
|
||||||
sstream << "o\n";
|
|
||||||
|
|
||||||
ss.SendNow(sstream.str().c_str());
|
|
||||||
|
|
||||||
unsigned int myDuration;
|
|
||||||
|
|
||||||
//Wrap everything in mp4 boxes
|
|
||||||
MP4::MFHD mfhd_box;
|
|
||||||
JSON::Value trackRef;
|
JSON::Value trackRef;
|
||||||
if (wantsVideo){
|
if (wantsVideo){
|
||||||
trackRef = allVideo.ObjBegin()->second;
|
trackRef = allVideo.ObjBegin()->second;
|
||||||
|
@ -355,26 +329,41 @@ namespace Connector_HTTP {
|
||||||
for (JSON::ArrIter keyIt = trackRef["keys"].ArrBegin(); keyIt != trackRef["keys"].ArrEnd(); keyIt++){
|
for (JSON::ArrIter keyIt = trackRef["keys"].ArrBegin(); keyIt != trackRef["keys"].ArrEnd(); keyIt++){
|
||||||
if ((*keyIt)["time"].asInt() >= (requestedTime / 10000)){
|
if ((*keyIt)["time"].asInt() >= (requestedTime / 10000)){
|
||||||
keyObj = (*keyIt);
|
keyObj = (*keyIt);
|
||||||
mfhd_box.setSequenceNumber((*keyIt)["num"].asInt());
|
|
||||||
myDuration = (*keyIt)["len"].asInt() * 10000;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sstream << "t " << myRef["trackid"].asInt() << "\n";
|
||||||
|
sstream << "s " << keyObj["time"].asInt() << "\n";
|
||||||
|
sstream << "p " << keyObj["time"].asInt() + keyObj["len"].asInt() << "\n";
|
||||||
|
// sstream << "o\n";
|
||||||
|
|
||||||
|
ss.SendNow(sstream.str().c_str());
|
||||||
|
unsigned int myDuration;
|
||||||
|
|
||||||
|
//Wrap everything in mp4 boxes
|
||||||
|
MP4::MFHD mfhd_box;
|
||||||
|
mfhd_box.setSequenceNumber(keyObj["num"].asInt());
|
||||||
|
myDuration = keyObj["len"].asInt() * 10000;
|
||||||
|
|
||||||
MP4::TFHD tfhd_box;
|
MP4::TFHD tfhd_box;
|
||||||
tfhd_box.setFlags(MP4::tfhdSampleFlag);
|
tfhd_box.setFlags(MP4::tfhdSampleFlag);
|
||||||
tfhd_box.setTrackID(1);
|
tfhd_box.setTrackID(1);
|
||||||
tfhd_box.setDefaultSampleFlags(0x000000C0 | MP4::isKeySample);
|
//if (trackRef["type"].asString() == "video"){
|
||||||
|
tfhd_box.setDefaultSampleFlags(0x000000C0 | MP4::noIPicture | MP4::noDisposable | MP4::noKeySample);
|
||||||
|
//}else{
|
||||||
|
// tfhd_box.setDefaultSampleFlags(0x000000C0 | MP4::noKeySample);
|
||||||
|
//}
|
||||||
|
|
||||||
MP4::TRUN trun_box;
|
MP4::TRUN trun_box;
|
||||||
trun_box.setDataOffset(42);
|
trun_box.setDataOffset(42);
|
||||||
if (trackRef["type"].asString() == "video"){
|
if (trackRef["type"].asString() == "video"){
|
||||||
trun_box.setFlags(MP4::trundataOffset | MP4::trunfirstSampleFlags | MP4::trunsampleDuration | MP4::trunsampleSize);
|
trun_box.setFlags(MP4::trundataOffset | MP4::trunfirstSampleFlags | MP4::trunsampleDuration | MP4::trunsampleSize);
|
||||||
trun_box.setFirstSampleFlags(0x00000040 | MP4::noKeySample);
|
|
||||||
}else{
|
}else{
|
||||||
trun_box.setFlags(MP4::trundataOffset | MP4::trunsampleDuration | MP4::trunsampleSize);
|
trun_box.setFlags(MP4::trundataOffset | MP4::trunsampleDuration | MP4::trunsampleSize);
|
||||||
trun_box.setFirstSampleFlags(0x00000040 | MP4::isKeySample);
|
// trun_box.setFirstSampleFlags(0x00000040 | MP4::noKeySample);
|
||||||
}
|
}
|
||||||
|
trun_box.setFirstSampleFlags(0x00000040 | MP4::isIPicture | MP4::noDisposable | MP4::isKeySample);
|
||||||
std::deque<long long int> tmpParts;
|
std::deque<long long int> tmpParts;
|
||||||
JSON::decodeVector(keyObj["parts"].asString(), tmpParts);
|
JSON::decodeVector(keyObj["parts"].asString(), tmpParts);
|
||||||
for (int i = 0; i < tmpParts.size(); i++){
|
for (int i = 0; i < tmpParts.size(); i++){
|
||||||
|
@ -411,7 +400,7 @@ namespace Connector_HTTP {
|
||||||
fragref_box.setVersion(1);
|
fragref_box.setVersion(1);
|
||||||
fragref_box.setFragmentCount(0);
|
fragref_box.setFragmentCount(0);
|
||||||
int fragCount = 0;
|
int fragCount = 0;
|
||||||
for (int i = 0; i < trackRef["keys"].size() - 1; i++){
|
for (int i = 0; i < 2 && i < trackRef["keys"].size() - 1; i++){//< trackRef["keys"].size() - 1; i++){
|
||||||
if (trackRef["keys"][i]["time"].asInt() > (requestedTime / 10000)){
|
if (trackRef["keys"][i]["time"].asInt() > (requestedTime / 10000)){
|
||||||
fragref_box.setTime(fragCount, trackRef["keys"][i]["time"].asInt() * 10000);
|
fragref_box.setTime(fragCount, trackRef["keys"][i]["time"].asInt() * 10000);
|
||||||
fragref_box.setDuration(fragCount, trackRef["keys"][i]["len"].asInt() * 10000);
|
fragref_box.setDuration(fragCount, trackRef["keys"][i]["len"].asInt() * 10000);
|
||||||
|
@ -466,7 +455,7 @@ namespace Connector_HTTP {
|
||||||
lastStats = now;
|
lastStats = now;
|
||||||
ss.SendNow(conn.getStats("HTTP_Smooth").c_str());
|
ss.SendNow(conn.getStats("HTTP_Smooth").c_str());
|
||||||
}
|
}
|
||||||
if (handlingRequest && ss.spool()){
|
if (/*handlingRequest &&*/ ss.spool()){
|
||||||
while (Strm.parsePacket(ss.Received())){
|
while (Strm.parsePacket(ss.Received())){
|
||||||
if (Strm.lastType() == DTSC::AUDIO || Strm.lastType() == DTSC::VIDEO){
|
if (Strm.lastType() == DTSC::AUDIO || Strm.lastType() == DTSC::VIDEO){
|
||||||
HTTP_S.Chunkify(Strm.lastData(), conn);
|
HTTP_S.Chunkify(Strm.lastData(), conn);
|
||||||
|
|
Loading…
Add table
Reference in a new issue