Added canSeek* functionality to DTSC::Stream, minor optimization to MP4 lib.

This commit is contained in:
Thulinma 2013-03-18 17:36:45 +01:00
parent 00d06fe293
commit f2b4e1d1a4
3 changed files with 39 additions and 1 deletions

View file

@ -384,7 +384,39 @@ void DTSC::Stream::updateRingHeaders(){
} }
} }
/// Returns 0 if seeking is possible, -1 if the wanted frame is too old, 1 if the wanted frame is too new.
int DTSC::Stream::canSeekms(unsigned int ms){
if ( !metadata["keytime"].size()){
return 1;
}
if (ms > metadata["keytime"][metadata["keytime"].size() - 1].asInt()){
return 1;
}
if (ms < metadata["keytime"][0u].asInt()){
return -1;
}
return 0;
}
/// Returns 0 if seeking is possible, -1 if the wanted frame is too old, 1 if the wanted frame is too new.
int DTSC::Stream::canSeekFrame(unsigned int frameno){
if ( !metadata["keynum"].size()){
return 1;
}
if (frameno > metadata["keynum"][metadata["keynum"].size() - 1].asInt()){
return 1;
}
if (frameno < metadata["keynum"][0u].asInt()){
return -1;
}
return 0;
}
unsigned int DTSC::Stream::msSeek(unsigned int ms){ unsigned int DTSC::Stream::msSeek(unsigned int ms){
if (ms > buffers[keyframes[0u].b]["time"].asInt()){
std::cerr << "Warning: seeking past ingest! (" << ms << "ms > " << buffers[keyframes[0u].b]["time"].asInt() << "ms)" << std::endl;
return keyframes[0u].b;
}
for (std::deque<DTSC::Ring>::iterator it = keyframes.begin(); it != keyframes.end(); it++){ for (std::deque<DTSC::Ring>::iterator it = keyframes.begin(); it != keyframes.end(); it++){
if (buffers[it->b]["time"].asInt() <= ms){ if (buffers[it->b]["time"].asInt() <= ms){
return it->b; return it->b;
@ -395,6 +427,10 @@ unsigned int DTSC::Stream::msSeek(unsigned int ms){
} }
unsigned int DTSC::Stream::frameSeek(unsigned int frameno){ unsigned int DTSC::Stream::frameSeek(unsigned int frameno){
if (frameno > buffers[keyframes[0u].b]["fragnum"].asInt()){
std::cerr << "Warning: seeking past ingest! (F" << frameno << " > F" << buffers[keyframes[0u].b]["fragnum"].asInt() << ")" << std::endl;
return keyframes[0u].b;
}
for (std::deque<DTSC::Ring>::iterator it = keyframes.begin(); it != keyframes.end(); it++){ for (std::deque<DTSC::Ring>::iterator it = keyframes.begin(); it != keyframes.end(); it++){
if (buffers[it->b]["fragnum"].asInt() == frameno){ if (buffers[it->b]["fragnum"].asInt() == frameno){
return it->b; return it->b;

View file

@ -127,6 +127,8 @@ namespace DTSC {
unsigned int getTime(); unsigned int getTime();
void dropRing(Ring * ptr); void dropRing(Ring * ptr);
void updateHeaders(); void updateHeaders();
int canSeekms(unsigned int ms);
int canSeekFrame(unsigned int frameno);
unsigned int msSeek(unsigned int ms); unsigned int msSeek(unsigned int ms);
unsigned int frameSeek(unsigned int frameno); unsigned int frameSeek(unsigned int frameno);
void setBufferTime(unsigned int ms); void setBufferTime(unsigned int ms);

View file

@ -2180,7 +2180,7 @@ namespace MP4 {
if (uuid_string[j] == '-'){ if (uuid_string[j] == '-'){
continue; continue;
} }
data[8+i/2] |= (c2hex(uuid_string[j]) << (4-(4*(i%2)))); data[8+i/2] |= (c2hex(uuid_string[j]) << ((~i & 1) << 2));
++i; ++i;
} }
} }