Upgraded DTSC Lib to do seeking through selected tracks rather than a list of keyframes.

This commit is contained in:
Erik Zandvliet 2013-05-13 09:25:49 +02:00
parent 23813cc9b2
commit c9f37c57b5
2 changed files with 35 additions and 62 deletions

View file

@ -532,8 +532,6 @@ DTSC::File & DTSC::File::operator =(const File & rhs){
jsonbuffer = rhs.jsonbuffer; jsonbuffer = rhs.jsonbuffer;
metadata = rhs.metadata; metadata = rhs.metadata;
firstmetadata = rhs.firstmetadata; firstmetadata = rhs.firstmetadata;
frames = rhs.frames;
msframes = rhs.msframes;
currtime = rhs.currtime; currtime = rhs.currtime;
lastreadpos = rhs.lastreadpos; lastreadpos = rhs.lastreadpos;
headerSize = rhs.headerSize; headerSize = rhs.headerSize;
@ -678,18 +676,6 @@ void DTSC::File::readHeader(int pos){
readHeader(metadata["moreheader"].asInt()); readHeader(metadata["moreheader"].asInt());
return; return;
} }
if (metadata.isMember("keytime")){
msframes.clear();
for (int i = 0; i < metadata["keytime"].size(); ++i){
msframes[i + 1] = metadata["keytime"][i].asInt();
}
}
if (metadata.isMember("keybpos")){
frames.clear();
for (int i = 0; i < metadata["keybpos"].size(); ++i){
frames[i + 1] = metadata["keybpos"][i].asInt();
}
}
metadata["vod"] = true; metadata["vod"] = true;
metadata.netPrepare(); metadata.netPrepare();
} }
@ -763,18 +749,16 @@ void DTSC::File::seekNext(){
jsonbuffer = JSON::fromDTMI(strbuffer); jsonbuffer = JSON::fromDTMI(strbuffer);
} }
if (jsonbuffer.isMember("keyframe")){ if (jsonbuffer.isMember("keyframe")){
if (frames[currframe] != lastreadpos){ if (metadata["tracks"][selectedTracks[0]]["keybpos"][currframe].asInt() != lastreadpos){
currframe++; currframe++;
currtime = jsonbuffer["time"].asInt(); currtime = jsonbuffer["time"].asInt();
#if DEBUG >= 6 #if DEBUG >= 6
if (frames[currframe] != lastreadpos){ if (metadata["tracks"][selectedTracks[0]]["keybpos"][currframe].asInt() != lastreadpos){
std::cerr << "Found a new frame " << currframe << " @ " << lastreadpos << "b/" << currtime << "ms" << std::endl; std::cerr << "Found a new frame " << currframe << " @ " << lastreadpos << "b/" << currtime << "ms" << std::endl;
} else{ } else{
std::cerr << "Passing frame " << currframe << " @ " << lastreadpos << "b/" << currtime << "ms" << std::endl; std::cerr << "Passing frame " << currframe << " @ " << lastreadpos << "b/" << currtime << "ms" << std::endl;
} }
#endif #endif
frames[currframe] = lastreadpos;
msframes[currframe] = currtime;
} }
} }
} }
@ -797,34 +781,28 @@ JSON::Value & DTSC::File::getJSON(){
/// Attempts to seek to the given frame number within the file. /// Attempts to seek to the given frame number within the file.
/// Returns true if successful, false otherwise. /// Returns true if successful, false otherwise.
bool DTSC::File::seek_frame(int frameno){ bool DTSC::File::seek_frame(int frameno){
if (frames.count(frameno) > 0){ int bytePos = -1;
if (fseek(F, frames[frameno], SEEK_SET) == 0){ int replaceBytePos = -1;
for (int i = 0; i < metadata["tracks"][selectedTracks[0]]["keynum"].size(); i++){
if (metadata["tracks"][selectedTracks[0]]["keynum"][i].asInt() == frameno){
bytePos = metadata["tracks"][selectedTracks[0]]["keybpos"][i].asInt();
break;
}
if (metadata["tracks"][selectedTracks[0]]["keynum"][i].asInt() < frameno){
replaceBytePos = metadata["tracks"][selectedTracks[0]]["keybpos"][i].asInt();
}
}
if (bytePos == -1){
bytePos = replaceBytePos;
}
if (bytePos > -1){
if (fseek(F, bytePos, SEEK_SET) == 0){
#if DEBUG >= 5 #if DEBUG >= 5
std::cerr << "Seek direct from " << currframe << " @ " << frames[currframe] << " to " << frameno << " @ " << frames[frameno] << std::endl; std::cerr << "Seek direct from " << currframe << " @ " << metadata["tracks"][selectedTracks[0]]["keybpos"][currframe].asInt() << " to " << frameno << " @ " << bytePos << std::endl;
#endif #endif
currframe = frameno; currframe = frameno;
return true; return true;
} }
}else{
for (int i = frameno; i >= 1; --i){
if (frames.count(i) > 0){
currframe = i;
break;
}
}
if (fseek(F, frames[currframe], SEEK_SET) == 0){
#if DEBUG >= 5
std::cerr << "Seeking from frame " << currframe << " @ " << frames[currframe] << " to " << frameno << std::endl;
#endif
while (currframe < frameno){
seekNext();
if (jsonbuffer.isNull()){
return false;
}
}
seek_frame(frameno);
return true;
}
} }
return false; return false;
} }
@ -832,31 +810,20 @@ bool DTSC::File::seek_frame(int frameno){
/// Attempts to seek to the given time in ms within the file. /// Attempts to seek to the given time in ms within the file.
/// Returns true if successful, false otherwise. /// Returns true if successful, false otherwise.
bool DTSC::File::seek_time(int ms){ bool DTSC::File::seek_time(int ms){
std::map<int, long>::iterator it;
currtime = 0; currtime = 0;
currframe = 1; currframe = 1;
for (it = msframes.begin(); it != msframes.end(); ++it){ int bytePos = -1;
if (it->second > ms){ for (int i = 0; i < metadata["tracks"][selectedTracks[0]]["keynum"].size(); i++){
if (metadata["tracks"][selectedTracks[0]]["keytime"][i].asInt() > ms){
break; break;
} }
if (it->second > currtime){ if (metadata["tracks"][selectedTracks[0]]["keytime"][i].asInt() > currtime){
currtime = it->second; currtime = metadata["tracks"][selectedTracks[0]]["keytime"][i].asInt();
currframe = it->first; currframe = i + 1;
} }
bytePos = metadata["tracks"][selectedTracks[0]]["keybpos"][i].asInt();
} }
if (fseek(F, frames[currframe], SEEK_SET) == 0){ if (fseek(F, bytePos, SEEK_SET) == 0){
#if DEBUG >= 5
std::cerr << "Seeking from frame " << currframe << " @ " << msframes[currframe] << "ms to " << ms << "ms" << std::endl;
#endif
while (currtime < ms){
seekNext();
if (jsonbuffer.isNull()){
return false;
}
}
if (currtime > ms){
return seek_frame(currframe - 1);
}
return true; return true;
} }
return false; return false;
@ -878,6 +845,10 @@ void DTSC::File::writePacket(JSON::Value & newPacket){
writePacket(newPacket.toNetPacked()); writePacket(newPacket.toNetPacked());
} }
void DTSC::File::selectTracks(std::vector<std::string> & trackIDs){
selectedTracks = trackIDs;
}
/// Close the file if open /// Close the file if open
DTSC::File::~File(){ DTSC::File::~File(){
if (F){ if (F){

View file

@ -88,14 +88,15 @@ namespace DTSC {
bool seek_bpos(int bpos); bool seek_bpos(int bpos);
void writePacket(std::string & newPacket); void writePacket(std::string & newPacket);
void writePacket(JSON::Value & newPacket); void writePacket(JSON::Value & newPacket);
void selectTracks(std::vector<std::string> & trackIDs);
private: private:
void readHeader(int pos); void readHeader(int pos);
std::string strbuffer; std::string strbuffer;
JSON::Value jsonbuffer; JSON::Value jsonbuffer;
JSON::Value metadata; JSON::Value metadata;
JSON::Value firstmetadata; JSON::Value firstmetadata;
std::map<int, long> frames; //std::map<int, long> frames;
std::map<int, long> msframes; //std::map<int, long> msframes;
long long int currtime; long long int currtime;
long long int lastreadpos; long long int lastreadpos;
int currframe; int currframe;
@ -103,6 +104,7 @@ namespace DTSC {
unsigned long headerSize; unsigned long headerSize;
char buffer[4]; char buffer[4];
bool created; bool created;
std::vector<std::string> selectedTracks;
}; };
//FileWriter //FileWriter