diff --git a/.gitignore b/.gitignore index bbbb44fb..0b3b45e4 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,4 @@ libtool *.flv *.json *.pc +*.swp diff --git a/lib/dtsc.cpp b/lib/dtsc.cpp index 3d0a64e0..9b209996 100644 --- a/lib/dtsc.cpp +++ b/lib/dtsc.cpp @@ -769,9 +769,10 @@ void DTSC::File::seekNext(){ return; } if (version == 2){ - strbuffer.erase(0,12); + jsonbuffer = JSON::fromDTMI2(strbuffer); + }else{ + jsonbuffer = JSON::fromDTMI(strbuffer); } - jsonbuffer = JSON::fromDTMI(strbuffer); if (jsonbuffer.isMember("keyframe")){ if (frames[currframe] != lastreadpos){ currframe++; diff --git a/lib/flv_tag.cpp b/lib/flv_tag.cpp index f7f04c79..c866da49 100644 --- a/lib/flv_tag.cpp +++ b/lib/flv_tag.cpp @@ -951,58 +951,58 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){ if (tmp->getContentP("videocodecid")){ switch ((unsigned int)tmp->getContentP("videocodecid")->NumValue()){ case 2: - metadata["video"]["codec"] = "H263"; + metadata["tracks"]["track1"]["codec"] = "H263"; break; case 4: - metadata["video"]["codec"] = "VP6"; + metadata["tracks"]["track1"]["codec"] = "VP6"; break; case 7: - metadata["video"]["codec"] = "H264"; + metadata["tracks"]["track1"]["codec"] = "H264"; break; default: - metadata["video"]["codec"] = "?"; + metadata["tracks"]["track1"]["codec"] = "?"; break; } } if (tmp->getContentP("audiocodecid")){ switch ((unsigned int)tmp->getContentP("audiocodecid")->NumValue()){ case 2: - metadata["audio"]["codec"] = "MP3"; + metadata["tracks"]["track2"]["codec"] = "MP3"; break; case 10: - metadata["audio"]["codec"] = "AAC"; + metadata["tracks"]["track2"]["codec"] = "AAC"; break; default: - metadata["audio"]["codec"] = "?"; + metadata["tracks"]["track2"]["codec"] = "?"; break; } } if (tmp->getContentP("width")){ - metadata["video"]["width"] = (long long int)tmp->getContentP("width")->NumValue(); + metadata["tracks"]["track1"]["width"] = (long long int)tmp->getContentP("width")->NumValue(); } if (tmp->getContentP("height")){ - metadata["video"]["height"] = (long long int)tmp->getContentP("height")->NumValue(); + metadata["tracks"]["track1"]["height"] = (long long int)tmp->getContentP("height")->NumValue(); } if (tmp->getContentP("framerate")){ - metadata["video"]["fpks"] = (long long int)(tmp->getContentP("framerate")->NumValue() * 1000.0); + metadata["tracks"]["track1"]["fpks"] = (long long int)(tmp->getContentP("framerate")->NumValue() * 1000.0); } if (tmp->getContentP("videodatarate")){ - metadata["video"]["bps"] = (long long int)(tmp->getContentP("videodatarate")->NumValue() * 1024) / 8; + metadata["tracks"]["track1"]["bps"] = (long long int)(tmp->getContentP("videodatarate")->NumValue() * 1024) / 8; } if (tmp->getContentP("audiodatarate")){ - metadata["audio"]["bps"] = (long long int)(tmp->getContentP("audiodatarate")->NumValue() * 1024) / 8; + metadata["tracks"]["track2"]["bps"] = (long long int)(tmp->getContentP("audiodatarate")->NumValue() * 1024) / 8; } if (tmp->getContentP("audiosamplerate")){ - metadata["audio"]["rate"] = (long long int)tmp->getContentP("audiosamplerate")->NumValue(); + metadata["tracks"]["track2"]["rate"] = (long long int)tmp->getContentP("audiosamplerate")->NumValue(); } if (tmp->getContentP("audiosamplesize")){ - metadata["audio"]["size"] = (long long int)tmp->getContentP("audiosamplesize")->NumValue(); + metadata["tracks"]["track2"]["size"] = (long long int)tmp->getContentP("audiosamplesize")->NumValue(); } if (tmp->getContentP("stereo")){ if (tmp->getContentP("stereo")->NumValue() == 1){ - metadata["audio"]["channels"] = 2; + metadata["tracks"]["track2"]["channels"] = 2; }else{ - metadata["audio"]["channels"] = 1; + metadata["tracks"]["track2"]["channels"] = 1; } } for (int i = 0; i < tmp->hasContent(); ++i){ @@ -1022,27 +1022,27 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){ pack_out["time"] = tagTime(); } } - if ( !metadata.isMember("length")){ - metadata["length"] = 0; + if ( !metadata["tracks"]["track1"].isMember("length")){ + metadata["tracks"]["track1"]["length"] = 0; } - if (metadata.isMember("video")){ - if ( !metadata["video"].isMember("width")){ - metadata["video"]["width"] = 0; + if (metadata["tracks"].isMember("track1")){ + if ( !metadata["tracks"]["track1"].isMember("width")){ + metadata["tracks"]["track1"]["width"] = 0; } - if ( !metadata["video"].isMember("height")){ - metadata["video"]["height"] = 0; + if ( !metadata["tracks"]["track1"].isMember("height")){ + metadata["tracks"]["track1"]["height"] = 0; } - if ( !metadata["video"].isMember("fpks")){ - metadata["video"]["fpks"] = 0; + if ( !metadata["tracks"]["track1"].isMember("fpks")){ + metadata["tracks"]["track1"]["fpks"] = 0; } - if ( !metadata["video"].isMember("bps")){ - metadata["video"]["bps"] = 0; + if ( !metadata["tracks"]["track1"].isMember("bps")){ + metadata["tracks"]["track1"]["bps"] = 0; } - if ( !metadata["video"].isMember("keyms")){ - metadata["video"]["keyms"] = 0; + if ( !metadata["tracks"]["track1"].isMember("keyms")){ + metadata["tracks"]["track1"]["keyms"] = 0; } - if ( !metadata["video"].isMember("keyvar")){ - metadata["video"]["keyvar"] = 0; + if ( !metadata["tracks"]["track1"].isMember("keyvar")){ + metadata["tracks"]["track1"]["keyvar"] = 0; } } return pack_out; //empty @@ -1051,50 +1051,50 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){ char audiodata = data[11]; if (needsInitData() && isInitData()){ if ((audiodata & 0xF0) == 0xA0){ - metadata["audio"]["init"] = std::string((char*)data + 13, (size_t)len - 17); + metadata["tracks"]["track2"]["init"] = std::string((char*)data + 13, (size_t)len - 17); }else{ - metadata["audio"]["init"] = std::string((char*)data + 12, (size_t)len - 16); + metadata["tracks"]["track2"]["init"] = std::string((char*)data + 12, (size_t)len - 16); } return pack_out; //skip rest of parsing, get next tag. } pack_out["datatype"] = "audio"; pack_out["time"] = tagTime(); - if ( !metadata["audio"].isMember("codec") || metadata["audio"]["codec"].asString() == "?" || metadata["audio"]["codec"].asString() == ""){ + if ( !metadata["tracks"]["track2"].isMember("codec") || metadata["tracks"]["track2"]["codec"].asString() == "?" || metadata["tracks"]["track2"]["codec"].asString() == ""){ metadata["audio"]["codec"] = getAudioCodec(); } - if ( !metadata["audio"].isMember("rate") || metadata["audio"]["rate"].asInt() < 1){ + if ( !metadata["tracks"]["track2"].isMember("rate") || metadata["tracks"]["track2"]["rate"].asInt() < 1){ switch (audiodata & 0x0C){ case 0x0: - metadata["audio"]["rate"] = 5512; + metadata["tracks"]["track2"]["rate"] = 5512; break; case 0x4: - metadata["audio"]["rate"] = 11025; + metadata["tracks"]["track2"]["rate"] = 11025; break; case 0x8: - metadata["audio"]["rate"] = 22050; + metadata["tracks"]["track2"]["rate"] = 22050; break; case 0xC: - metadata["audio"]["rate"] = 44100; + metadata["tracks"]["track2"]["rate"] = 44100; break; } } - if ( !metadata["audio"].isMember("size") || metadata["audio"]["size"].asInt() < 1){ + if ( !metadata["tracks"]["track2"].isMember("size") || metadata["tracks"]["track2"]["size"].asInt() < 1){ switch (audiodata & 0x02){ case 0x0: - metadata["audio"]["size"] = 8; + metadata["tracks"]["track2"]["size"] = 8; break; case 0x2: - metadata["audio"]["size"] = 16; + metadata["tracks"]["track2"]["size"] = 16; break; } } - if ( !metadata["audio"].isMember("channels") || metadata["audio"]["channels"].asInt() < 1){ + if ( !metadata["tracks"]["track2"].isMember("channels") || metadata["tracks"]["track2"]["channels"].asInt() < 1){ switch (audiodata & 0x01){ case 0x0: - metadata["audio"]["channels"] = 1; + metadata["tracks"]["track2"]["channels"] = 1; break; case 0x1: - metadata["audio"]["channels"] = 2; + metadata["tracks"]["track2"]["channels"] = 2; break; } } @@ -1118,17 +1118,17 @@ JSON::Value FLV::Tag::toJSON(JSON::Value & metadata){ if (len < 21){ return JSON::Value(); } - metadata["video"]["init"] = std::string((char*)data + 16, (size_t)len - 20); + metadata["tracks"]["track1"]["init"] = std::string((char*)data + 16, (size_t)len - 20); }else{ if (len < 17){ return JSON::Value(); } - metadata["video"]["init"] = std::string((char*)data + 12, (size_t)len - 16); + metadata["tracks"]["track1"]["init"] = std::string((char*)data + 12, (size_t)len - 16); } return pack_out; //skip rest of parsing, get next tag. } - if ( !metadata["video"].isMember("codec") || metadata["video"]["codec"].asString() == "?" || metadata["video"]["codec"].asString() == ""){ - metadata["video"]["codec"] = getVideoCodec(); + if ( !metadata["tracks"]["track1"].isMember("codec") || metadata["tracks"]["track1"]["codec"].asString() == "?" || metadata["tracks"]["track1"]["codec"].asString() == ""){ + metadata["tracks"]["track1"]["codec"] = getVideoCodec(); } pack_out["datatype"] = "video"; switch (videodata & 0xF0){ diff --git a/lib/json.cpp b/lib/json.cpp index 0b3db6fc..d61111a3 100644 --- a/lib/json.cpp +++ b/lib/json.cpp @@ -478,11 +478,12 @@ void JSON::Value::netPrepare(){ //insert proper header for this type of data int packID = -1; long long unsigned int time = objVal["time"].asInt(); - std::string dataType = objVal["datatype"].asString(); + std::string dataType; if (isMember("datatype")){ + dataType = objVal["datatype"].asString(); if (isMember("trackid")){ packID = objVal["trackid"].asInt(); - }else{ + }else{ if (objVal["datatype"].asString() == "video"){ packID = 1; } @@ -498,12 +499,15 @@ void JSON::Value::netPrepare(){ } removeMember("time"); removeMember("datatype"); + removeMember("trackid"); packed = toPacked(); objVal["time"] = (long long int)time; objVal["datatype"] = dataType; + objVal["trackid"] = packID; strVal.resize(packed.size() + 20); memcpy((void*)strVal.c_str(), "DTP2", 4); }else{ + packID = -1; strVal.resize(packed.size() + 8); memcpy((void*)strVal.c_str(), "DTSC", 4); } @@ -512,7 +516,7 @@ void JSON::Value::netPrepare(){ memcpy((void*)(strVal.c_str() + 4), (void*) &size, 4); //copy the rest of the string if (packID != -1){ - packID = htonl((int)packID); + packID = htonl(packID); memcpy((void*)(strVal.c_str() + 8), (void*) &packID, 4); int tmpHalf = htonl((int)(time >> 32)); memcpy((void*)(strVal.c_str() + 12), (void*) &tmpHalf, 4); @@ -863,3 +867,14 @@ JSON::Value JSON::fromDTMI(std::string data){ unsigned int i = 0; return fromDTMI((const unsigned char*)data.c_str(), data.size(), i); } //fromDTMI + +JSON::Value JSON::fromDTMI2(std::string data){ + JSON::Value tmp = fromDTMI(data.substr(12)); + long long int tmpTrackID = ntohl(((int*)(data.c_str()))[0]); + long long int tmpTime = ntohl(((int*)(data.c_str() + 4))[0]); + tmpTime << 32; + tmpTime += ntohl(((int*)(data.c_str() + 8))[0]); + tmp["time"] = tmpTime; + tmp["trackid"] = tmpTrackID; + return tmp; +} diff --git a/lib/json.h b/lib/json.h index 2f2e4e55..f54e7384 100644 --- a/lib/json.h +++ b/lib/json.h @@ -93,6 +93,7 @@ namespace JSON { void null(); }; + Value fromDTMI2(std::string data); Value fromDTMI(std::string data); Value fromDTMI(const unsigned char * data, unsigned int len, unsigned int &i); Value fromString(std::string json);