Fix bug in Output::seek() when seeking to a timestamp that is between the last part of a key and the first part of the next key

This commit is contained in:
Thulinma 2021-02-02 01:20:23 +01:00
parent dd5ae98002
commit 4080d141f8
7 changed files with 44 additions and 26 deletions

View file

@ -394,7 +394,7 @@ namespace Mist{
tmpPos.seekTime = 0;
}
DTSC::Keys keys(M.keys(trackIdx));
uint32_t keyNum = keys.getNumForTime(ms);
uint32_t keyNum = M.getKeyNumForTime(trackIdx, ms);
if (keys.getTime(keyNum) > tmpPos.seekTime){
tmpPos.seekTime = keys.getTime(keyNum);
tmpPos.bytePos = keys.getBpos(keyNum);

View file

@ -163,7 +163,7 @@ namespace Mist{
// keyframe. Flv files are never multi-track, so track 1 is video, track 2 is audio.
size_t seekTrack = (idx == INVALID_TRACK_ID ? M.mainTrack() : idx);
DTSC::Keys keys(M.keys(seekTrack));
uint32_t keyNum = keys.getNumForTime(seekTime);
uint32_t keyNum = M.getKeyNumForTime(seekTrack, seekTime);
Util::fseek(inFile, keys.getBpos(keyNum), SEEK_SET);
}
}// namespace Mist

View file

@ -150,7 +150,7 @@ namespace Mist{
void inputMP3::seek(uint64_t seekTime, size_t idx){
DTSC::Keys keys(M.keys(idx));
uint32_t keyNum = keys.getNumForTime(seekTime);
uint32_t keyNum = M.getKeyNumForTime(idx, seekTime);
fseek(inFile, keys.getBpos(keyNum), SEEK_SET);
timestamp = keys.getTime(keyNum);
}

View file

@ -457,14 +457,14 @@ namespace Mist{
readPMT();
uint64_t seekPos = 0xFFFFFFFFull;
if (idx != INVALID_TRACK_ID){
uint32_t keyNum = M.getKeyNumForTime(idx, seekTime);
DTSC::Keys keys(M.keys(idx));
uint32_t keyNum = keys.getNumForTime(seekTime);
seekPos = keys.getBpos(keyNum);
}else{
std::set<size_t> tracks = M.getValidTracks();
for (std::set<size_t>::iterator it = tracks.begin(); it != tracks.end(); it++){
uint32_t keyNum = M.getKeyNumForTime(*it, seekTime);
DTSC::Keys keys(M.keys(*it));
uint32_t keyNum = keys.getNumForTime(seekTime);
uint64_t thisBPos = keys.getBpos(keyNum);
if (thisBPos < seekPos){seekPos = thisBPos;}
}