Edited DTSCFix to update DTSC files to DTSCv2

This commit is contained in:
Erik Zandvliet 2013-04-17 13:24:07 +02:00
parent 3e944397f6
commit 3d6dd21773

View file

@ -8,6 +8,17 @@
///\brief Holds everything unique to converters. ///\brief Holds everything unique to converters.
namespace Converters { namespace Converters {
class HeaderEntryDTSC {
public:
HeaderEntryDTSC() : totalSize(0), keyNum(0), packetID(0), firstms(-1), lastms(0), keynum(0) {}
long long unsigned int totalSize;
long long int keyNum;
long long int packetID;
long long int firstms;
long long int lastms;
long long int keynum;
std::string type;
};
///\brief Reads a DTSC file and attempts to fix the metadata in it. ///\brief Reads a DTSC file and attempts to fix the metadata in it.
///\param conf The current configuration of the program. ///\param conf The current configuration of the program.
@ -23,88 +34,132 @@ namespace Converters {
return 1; return 1;
} }
if (oriheader["moreheader"].asInt() > 0){ if (oriheader["moreheader"].asInt() > 0){
if ((meta.isMember("keytime") && meta.isMember("keybpos") && meta.isMember("keynum") && meta.isMember("keylen") && meta.isMember("frags")) if (meta.isMember("tracks") && meta.isMember("isFixed") && meta["isFixed"]){
|| !meta.isMember("video")){
std::cerr << "This file was already fixed or doesn't need fixing - cancelling." << std::endl; std::cerr << "This file was already fixed or doesn't need fixing - cancelling." << std::endl;
return 0; return 0;
} }
} }
meta.removeMember("isFixed");
meta.removeMember("keytime"); meta.removeMember("keytime");
meta.removeMember("keybpos"); meta.removeMember("keybpos");
meta.removeMember("moreheader"); meta.removeMember("moreheader");
std::map<std::string,int> trackIDs;
std::map<std::string,HeaderEntryDTSC> trackData;
long long int nowpack = 0; long long int nowpack = 0;
long long int lastaudio = 0; // long long int lastaudio = 0;
long long int lastvideo = 0; // long long int lastvideo = 0;
long long unsigned int totalvideo = 0; // long long unsigned int totalvideo = 0;
long long unsigned int totalaudio = 0; // long long unsigned int totalaudio = 0;
long long int keynum = 0; // long long int keynum = 0;
std::string currentID;
int nextFreeID = 0;
F.seekNext(); F.seekNext();
while ( !F.getJSON().isNull()){ while ( !F.getJSON().isNull()){
if (F.getJSON()["packetid"].asInt() == 0){
if (F.getJSON()["datatype"].asString() == "video"){
currentID = "video0";
trackData[currentID].packetID = 0;
if (meta.isMember("video")){
meta["tracks"][currentID] = meta["video"];
meta.removeMember("video");
}
}
if (F.getJSON()["datatype"].asString() == "audio"){
currentID = "audio0";
trackData[currentID].packetID = 0;
if (meta.isMember("audio")){
meta["tracks"][currentID] = meta["audio"];
meta.removeMember("audio");
}
}
}
if (trackData[currentID].type == ""){
trackData[currentID].type = F.getJSON()["datatype"].asString();
}
if (F.getJSON()["time"].asInt() >= nowpack){ if (F.getJSON()["time"].asInt() >= nowpack){
nowpack = F.getJSON()["time"].asInt(); nowpack = F.getJSON()["time"].asInt();
} }
if ( !meta.isMember("firstms")){ if (trackData[currentID].firstms == -1){
meta["firstms"] = nowpack; trackData[currentID].firstms = nowpack;
}
if (F.getJSON()["datatype"].asString() == "audio"){
totalaudio += F.getJSON()["data"].asString().size();
lastaudio = nowpack;
} }
trackData[currentID].totalSize += F.getJSON()["data"].asString().size();
trackData[currentID].lastms = nowpack;
if (F.getJSON()["datatype"].asString() == "video"){ if (F.getJSON()["datatype"].asString() == "video"){
if (F.getJSON()["keyframe"].asInt() != 0){ if (F.getJSON()["keyframe"].asInt() != 0){
meta["keytime"].append(F.getJSON()["time"]); meta["tracks"][currentID]["keytime"].append(F.getJSON()["time"]);
meta["keybpos"].append(F.getLastReadPos()); meta["tracks"][currentID]["keybpos"].append(F.getLastReadPos());
meta["keynum"].append( ++keynum); meta["tracks"][currentID]["keynum"].append( ++trackData[currentID].keynum);
if (meta["keytime"].size() > 1){ if (meta["tracks"][currentID]["keytime"].size() > 1){
meta["keylen"].append(F.getJSON()["time"].asInt() - meta["keytime"][meta["keytime"].size() - 2].asInt()); meta["tracks"][currentID]["keylen"].append(F.getJSON()["time"].asInt() - meta["tracks"][currentID]["keytime"][meta["tracks"][currentID]["keytime"].size() - 2].asInt());
} }
} }
totalvideo += F.getJSON()["data"].asString().size();
lastvideo = nowpack;
} }
F.seekNext(); F.seekNext();
} }
meta["length"] = ((nowpack - meta["firstms"].asInt()) / 1000); long long int firstms = 9999999999;
meta["lastms"] = nowpack; long long int lastms = -1;
if (meta.isMember("audio")){
meta["audio"]["bps"] = (long long int)(totalaudio / ((lastaudio - meta["firstms"].asInt()) / 1000)); for (std::map<std::string,HeaderEntryDTSC>::iterator it = trackData.begin(); it != trackData.end(); it++){
} if (it->second.firstms < firstms){
if (meta.isMember("video")){ firstms = it->second.firstms;
meta["video"]["bps"] = (long long int)(totalvideo / ((lastvideo - meta["firstms"].asInt()) / 1000));
meta["video"]["keyms"] = ((lastvideo - meta["firstms"].asInt()) / meta["keytime"].size());
//append last keylen element - keytime, keybpos, keynum and keylen are now complete
if (meta["keytime"].size() > 0){
meta["keylen"].append(nowpack - meta["keytime"][meta["keytime"].size() - 1].asInt());
}else{
meta["keylen"].append(nowpack);
} }
//calculate fragments if (it->second.lastms > lastms){
meta["frags"].null(); lastms = it->second.lastms;
long long int currFrag = -1; }
for (unsigned int i = 0; i < meta["keytime"].size(); i++){ meta["tracks"][it->first]["firstms"] = it->second.firstms;
if (meta["keytime"][i].asInt() / 10000 > currFrag){ meta["tracks"][it->first]["lastms"] = it->second.lastms;
currFrag = meta["keytime"][i].asInt() / 10000; meta["tracks"][it->first]["length"] = (it->second.lastms - it->second.firstms) / 1000;
long long int fragLen = 1; if ( !meta["tracks"][it->first].isMember("bps")){
long long int fragDur = meta["keylen"][i].asInt(); meta["tracks"][it->first]["bps"] = (long long int)(it->second.lastms / ((it->second.lastms - it->second.firstms) / 1000));
for (unsigned int j = i; j < meta["keytime"].size(); j++){ }
if (meta["keytime"][j].asInt() / 10000 > currFrag || j == meta["keytime"].size() - 1){ meta["tracks"][it->first]["packetid"] = it->second.packetID;
JSON::Value thisFrag; if (it->second.packetID != 0){
thisFrag["num"] = meta["keynum"][i]; meta["tracks"][it->first]["trackid"] = trackIDs[it->first];
thisFrag["len"] = fragLen; }else{
thisFrag["dur"] = fragDur; meta["tracks"][it->first]["trackid"] = nextFreeID ++;
meta["frags"].append(thisFrag); }
break; meta["tracks"][it->first]["type"] = it->second.type;
if (it->second.type == "video"){
int tmp = meta["tracks"][it->first]["keytime"].size();
if (tmp > 0){
meta["tracks"][it->first]["keylen"].append(it->second.lastms - meta["tracks"][it->first]["keytime"][tmp - 1].asInt());
}else{
meta["tracks"][it->first]["keylen"].append(it->second.lastms);
}
//calculate fragments
meta["tracks"][it->first]["frags"].null();
long long int currFrag = -1;
for (unsigned int i = 0; i < meta["tracks"][it->first]["keytime"].size(); i++){
if (meta["tracks"][it->first]["keytime"][i].asInt() / 10000 > currFrag){
currFrag = meta["tracks"][it->first]["keytime"][i].asInt() / 10000;
long long int fragLen = 1;
long long int fragDur = meta["tracks"][it->first]["keylen"][i].asInt();
for (unsigned int j = i; j < meta["tracks"][it->first]["keytime"].size(); j++){
if (meta["tracks"][it->first]["keytime"][j].asInt() / 10000 > currFrag || j == meta["tracks"][it->first]["keytime"].size() - 1){
JSON::Value thisFrag;
thisFrag["num"] = meta["tracks"][it->first]["keynum"][i];
thisFrag["len"] = fragLen;
thisFrag["dur"] = fragDur;
meta["tracks"][it->first]["frags"].append(thisFrag);
break;
}
fragLen++;
fragDur += meta["tracks"][it->first]["keylen"][j].asInt();
} }
fragLen++;
fragDur += meta["keylen"][j].asInt();
} }
} }
} }
} }
meta["firstms"] = firstms;
meta["lastms"] = lastms;
meta["length"] = (lastms - firstms) / 1000;
//append the revised header //append the revised header
std::string loader = meta.toPacked(); std::string loader = meta.toPacked();
long long int newHPos = F.addHeader(loader); long long int newHPos = F.addHeader(loader);