Merge branch 'development' into LTS_development

This commit is contained in:
Thulinma 2018-08-24 20:05:14 +02:00
commit 84de51ab8c
3 changed files with 23 additions and 3 deletions

View file

@ -847,7 +847,8 @@ namespace Mist{
} }
/// Prepares all tracks from selectedTracks for seeking to the specified ms position. /// Prepares all tracks from selectedTracks for seeking to the specified ms position.
void Output::seek(unsigned long long pos){ /// If toKey is true, clips the seek to the nearest keyframe if the main track is a video track.
void Output::seek(unsigned long long pos, bool toKey){
sought = true; sought = true;
if (!isInitialized){ if (!isInitialized){
initialize(); initialize();
@ -857,6 +858,25 @@ namespace Mist{
if (myMeta.live){ if (myMeta.live){
updateMeta(); updateMeta();
} }
if (toKey){
long unsigned int mainTrack = getMainSelectedTrack();
//abort toKey if there are no keys in the main track
if (!myMeta.tracks.count(mainTrack) || !myMeta.tracks[mainTrack].keys.size()){
WARN_MSG("Sync-seeking impossible (main track invalid); performing regular seek instead");
seek(pos);
return;
}
DTSC::Track & Trk = myMeta.tracks[mainTrack];
if (Trk.type == "video"){
unsigned long long seekPos = 0;
for (std::deque<DTSC::Key>::iterator it = Trk.keys.begin(); it != Trk.keys.end(); ++it){
unsigned long long currPos = it->getTime();
if (currPos > pos){break;}//stop if we're past the point we wanted
seekPos = currPos;
}
pos = seekPos;
}
}
MEDIUM_MSG("Seeking to %llums", pos); MEDIUM_MSG("Seeking to %llums", pos);
std::set<long unsigned int> seekTracks = selectedTracks; std::set<long unsigned int> seekTracks = selectedTracks;
for (std::set<long unsigned int>::iterator it = seekTracks.begin(); it != seekTracks.end(); it++){ for (std::set<long unsigned int>::iterator it = seekTracks.begin(); it != seekTracks.end(); it++){

View file

@ -46,7 +46,7 @@ namespace Mist {
//non-virtual generic functions //non-virtual generic functions
virtual int run(); virtual int run();
virtual void stats(bool force = false); virtual void stats(bool force = false);
void seek(unsigned long long pos); void seek(unsigned long long pos, bool toKey = false);
bool seek(unsigned int tid, unsigned long long pos, bool getNextKey = false); bool seek(unsigned int tid, unsigned long long pos, bool getNextKey = false);
void stop(); void stop();
uint64_t currentTime(); uint64_t currentTime();

View file

@ -837,7 +837,7 @@ namespace Mist{
amfReply.getContentP(3)->addContent(AMF::Object("details", "DDV")); amfReply.getContentP(3)->addContent(AMF::Object("details", "DDV"));
amfReply.getContentP(3)->addContent(AMF::Object("clientid", (double)1337)); amfReply.getContentP(3)->addContent(AMF::Object("clientid", (double)1337));
sendCommand(amfReply, playMessageType, playStreamId); sendCommand(amfReply, playMessageType, playStreamId);
seek((long long int)amfData.getContentP(3)->NumValue()); seek((long long int)amfData.getContentP(3)->NumValue(), true);
//send a status reply //send a status reply
AMF::Object amfreply("container", AMF::AMF0_DDV_CONTAINER); AMF::Object amfreply("container", AMF::AMF0_DDV_CONTAINER);