Upgraded DTSC Lib to do seeking through selected tracks rather than a list of keyframes.
This commit is contained in:
parent
23813cc9b2
commit
c9f37c57b5
2 changed files with 35 additions and 62 deletions
91
lib/dtsc.cpp
91
lib/dtsc.cpp
|
@ -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){
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue