Added support for external writers
This commit is contained in:
parent
6921586622
commit
2b18a414b4
15 changed files with 510 additions and 154 deletions
164
lib/dtsc.cpp
164
lib/dtsc.cpp
|
@ -950,12 +950,8 @@ namespace DTSC{
|
|||
inFile.read(scanBuf, fileSize);
|
||||
|
||||
inFile.close();
|
||||
|
||||
size_t offset = 8;
|
||||
if (!memcmp(scanBuf, "DTP2", 4)){offset = 20;}
|
||||
|
||||
DTSC::Scan src(scanBuf + offset, fileSize - offset);
|
||||
reInit(_streamName, src);
|
||||
DTSC::Packet pkt(scanBuf, fileSize, true);
|
||||
reInit(_streamName, pkt.getScan());
|
||||
free(scanBuf);
|
||||
}
|
||||
|
||||
|
@ -2693,134 +2689,6 @@ namespace DTSC{
|
|||
return result;
|
||||
}
|
||||
|
||||
/// Writes the current Meta object in DTSH format to the given filename
|
||||
void Meta::toFile(const std::string &fName) const{
|
||||
std::string lVars;
|
||||
size_t lVarSize = 0;
|
||||
if (inputLocalVars.size()){
|
||||
lVars = inputLocalVars.toString();
|
||||
lVarSize = 2 + 14 + 5 + lVars.size();
|
||||
}
|
||||
|
||||
std::ofstream oFile(fName.c_str(), std::ios::binary | std::ios::ate);
|
||||
oFile.write(DTSC::Magic_Header, 4);
|
||||
oFile.write(c32(lVarSize + getSendLen() - 8), 4);
|
||||
oFile.write("\340", 1);
|
||||
if (getVod()){oFile.write("\000\003vod\001\000\000\000\000\000\000\000\001", 14);}
|
||||
if (getLive()){oFile.write("\000\004live\001\000\000\000\000\000\000\000\001", 15);}
|
||||
oFile.write("\000\007version\001", 10);
|
||||
oFile.write(c64(DTSH_VERSION), 8);
|
||||
if (lVarSize){
|
||||
oFile.write("\000\016inputLocalVars\002", 17);
|
||||
oFile.write(c32(lVars.size()), 4);
|
||||
oFile.write(lVars.data(), lVars.size());
|
||||
}
|
||||
oFile.write("\000\006tracks\340", 9);
|
||||
for (std::map<size_t, Track>::const_iterator it = tracks.begin(); it != tracks.end(); it++){
|
||||
if (!it->second.parts.getPresent()){continue;}
|
||||
std::string tmp = getTrackIdentifier(it->first, true);
|
||||
oFile.write(c16(tmp.size()), 2);
|
||||
oFile.write(tmp.data(), tmp.size());
|
||||
oFile.write("\340", 1); // Begin track object
|
||||
|
||||
size_t fragCount = it->second.fragments.getPresent();
|
||||
oFile.write("\000\011fragments\002", 12);
|
||||
oFile.write(c32(fragCount * DTSH_FRAGMENT_SIZE), 4);
|
||||
for (size_t i = 0; i < fragCount; i++){
|
||||
oFile.write(c32(it->second.fragments.getInt("duration", i)), 4);
|
||||
oFile.put(it->second.fragments.getInt("keys", i));
|
||||
oFile.write(c32(it->second.fragments.getInt("firstkey", i) + 1), 4);
|
||||
oFile.write(c32(it->second.fragments.getInt("size", i)), 4);
|
||||
}
|
||||
|
||||
size_t keyCount = it->second.keys.getPresent();
|
||||
oFile.write("\000\004keys\002", 7);
|
||||
oFile.write(c32(keyCount * DTSH_KEY_SIZE), 4);
|
||||
for (size_t i = 0; i < keyCount; i++){
|
||||
oFile.write(c64(it->second.keys.getInt("bpos", i)), 8);
|
||||
oFile.write(c24(it->second.keys.getInt("duration", i)), 3);
|
||||
oFile.write(c32(it->second.keys.getInt("number", i) + 1), 4);
|
||||
oFile.write(c16(it->second.keys.getInt("parts", i)), 2);
|
||||
oFile.write(c64(it->second.keys.getInt("time", i)), 8);
|
||||
}
|
||||
oFile.write("\000\010keysizes\002,", 11);
|
||||
oFile.write(c32(keyCount * 4), 4);
|
||||
for (size_t i = 0; i < keyCount; i++){
|
||||
oFile.write(c32(it->second.keys.getInt("size", i)), 4);
|
||||
}
|
||||
|
||||
size_t partCount = it->second.parts.getPresent();
|
||||
oFile.write("\000\005parts\002", 8);
|
||||
oFile.write(c32(partCount * DTSH_PART_SIZE), 4);
|
||||
for (size_t i = 0; i < partCount; i++){
|
||||
oFile.write(c24(it->second.parts.getInt("size", i)), 3);
|
||||
oFile.write(c24(it->second.parts.getInt("duration", i)), 3);
|
||||
oFile.write(c24(it->second.parts.getInt("offset", i)), 3);
|
||||
}
|
||||
|
||||
oFile.write("\000\007trackid\001", 10);
|
||||
oFile.write(c64(it->second.track.getInt("id")), 8);
|
||||
|
||||
if (it->second.track.getInt("missedFrags")){
|
||||
oFile.write("\000\014missed_frags\001", 15);
|
||||
oFile.write(c64(it->second.track.getInt("missedFrags")), 8);
|
||||
}
|
||||
|
||||
oFile.write("\000\007firstms\001", 10);
|
||||
oFile.write(c64(it->second.track.getInt("firstms")), 8);
|
||||
oFile.write("\000\006lastms\001", 9);
|
||||
oFile.write(c64(it->second.track.getInt("lastms")), 8);
|
||||
|
||||
oFile.write("\000\003bps\001", 6);
|
||||
oFile.write(c64(it->second.track.getInt("bps")), 8);
|
||||
|
||||
oFile.write("\000\006maxbps\001", 9);
|
||||
oFile.write(c64(it->second.track.getInt("maxbps")), 8);
|
||||
|
||||
tmp = getInit(it->first);
|
||||
oFile.write("\000\004init\002", 7);
|
||||
oFile.write(c32(tmp.size()), 4);
|
||||
oFile.write(tmp.data(), tmp.size());
|
||||
|
||||
tmp = getCodec(it->first);
|
||||
oFile.write("\000\005codec\002", 8);
|
||||
oFile.write(c32(tmp.size()), 4);
|
||||
oFile.write(tmp.data(), tmp.size());
|
||||
|
||||
tmp = getLang(it->first);
|
||||
if (tmp.size() && tmp != "und"){
|
||||
oFile.write("\000\004lang\002", 7);
|
||||
oFile.write(c32(tmp.size()), 4);
|
||||
oFile.write(tmp.data(), tmp.size());
|
||||
}
|
||||
|
||||
tmp = getType(it->first);
|
||||
oFile.write("\000\004type\002", 7);
|
||||
oFile.write(c32(tmp.size()), 4);
|
||||
oFile.write(tmp.data(), tmp.size());
|
||||
|
||||
if (tmp == "audio"){
|
||||
oFile.write("\000\004rate\001", 7);
|
||||
oFile.write(c64(it->second.track.getInt("rate")), 8);
|
||||
oFile.write("\000\004size\001", 7);
|
||||
oFile.write(c64(it->second.track.getInt("size")), 8);
|
||||
oFile.write("\000\010channels\001", 11);
|
||||
oFile.write(c64(it->second.track.getInt("channels")), 8);
|
||||
}else if (tmp == "video"){
|
||||
oFile.write("\000\005width\001", 8);
|
||||
oFile.write(c64(it->second.track.getInt("width")), 8);
|
||||
oFile.write("\000\006height\001", 9);
|
||||
oFile.write(c64(it->second.track.getInt("height")), 8);
|
||||
oFile.write("\000\004fpks\001", 7);
|
||||
oFile.write(c64(it->second.track.getInt("fpks")), 8);
|
||||
}
|
||||
oFile.write("\000\000\356", 3); // End this track Object
|
||||
}
|
||||
oFile.write("\000\000\356", 3); // End tracks object
|
||||
oFile.write("\000\000\356", 3); // End global object
|
||||
oFile.close();
|
||||
}
|
||||
|
||||
/// Converts the current Meta object to JSON format
|
||||
void Meta::toJSON(JSON::Value &res, bool skipDynamic, bool tracksOnly) const{
|
||||
res.null();
|
||||
|
@ -2885,10 +2753,29 @@ namespace DTSC{
|
|||
if (getSource() != ""){res["source"] = getSource();}
|
||||
}
|
||||
|
||||
/// Writes the current Meta object in DTSH format to the given uri
|
||||
void Meta::toFile(const std::string &uri) const{
|
||||
// Create writing socket
|
||||
int outFd = -1;
|
||||
if (!Util::externalWriter(uri, outFd, false)){return;}
|
||||
Socket::Connection outFile(outFd, -1);
|
||||
if (outFile){
|
||||
send(outFile, false, getValidTracks(), false);
|
||||
outFile.close();
|
||||
}
|
||||
}
|
||||
|
||||
/// Sends the current Meta object through a socket in DTSH format
|
||||
void Meta::send(Socket::Connection &conn, bool skipDynamic, std::set<size_t> selectedTracks, bool reID) const{
|
||||
std::string lVars;
|
||||
size_t lVarSize = 0;
|
||||
if (inputLocalVars.size()){
|
||||
lVars = inputLocalVars.toString();
|
||||
lVarSize = 2 + 14 + 5 + lVars.size();
|
||||
}
|
||||
|
||||
conn.SendNow(DTSC::Magic_Header, 4);
|
||||
conn.SendNow(c32(getSendLen(skipDynamic, selectedTracks) - 8), 4);
|
||||
conn.SendNow(c32(lVarSize + getSendLen(skipDynamic, selectedTracks) - 8), 4);
|
||||
conn.SendNow("\340", 1);
|
||||
if (getVod()){conn.SendNow("\000\003vod\001\000\000\000\000\000\000\000\001", 14);}
|
||||
if (getLive()){conn.SendNow("\000\004live\001\000\000\000\000\000\000\000\001", 15);}
|
||||
|
@ -2898,6 +2785,11 @@ namespace DTSC{
|
|||
conn.SendNow("\000\010unixzero\001", 11);
|
||||
conn.SendNow(c64(Util::unixMS() - Util::bootMS() + getBootMsOffset()), 8);
|
||||
}
|
||||
if (lVarSize){
|
||||
conn.SendNow("\000\016inputLocalVars\002", 17);
|
||||
conn.SendNow(c32(lVars.size()), 4);
|
||||
conn.SendNow(lVars.data(), lVars.size());
|
||||
}
|
||||
conn.SendNow("\000\006tracks\340", 9);
|
||||
for (std::set<size_t>::const_iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++){
|
||||
std::string tmp = getTrackIdentifier(*it, true);
|
||||
|
@ -2923,7 +2815,7 @@ namespace DTSC{
|
|||
conn.SendNow(c32(fragments.getInt("duration", i + fragBegin)), 4);
|
||||
conn.SendNow(std::string(1, (char)fragments.getInt("keys", i + fragBegin)));
|
||||
|
||||
conn.SendNow(c32(fragments.getInt("firstkey", i + fragBegin)), 4);
|
||||
conn.SendNow(c32(fragments.getInt("firstkey", i + fragBegin) + 1), 4);
|
||||
conn.SendNow(c32(fragments.getInt("size", i + fragBegin)), 4);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue