diff --git a/aegisub/src/audio_controller.cpp b/aegisub/src/audio_controller.cpp index 92dae866d..2453d5d38 100644 --- a/aegisub/src/audio_controller.cpp +++ b/aegisub/src/audio_controller.cpp @@ -92,7 +92,6 @@ class AudioMarkerProviderKeyframes : public AudioMarkerProvider { keyframe_samples.push_back(AudioMarkerKeyframe( controller->SamplesFromMilliseconds(vc->TimeAtFrame(raw_keyframes[i])))); } - std::sort(keyframe_samples.begin(), keyframe_samples.end()); AnnounceMarkerMoved(); } diff --git a/aegisub/src/mkv_wrap.cpp b/aegisub/src/mkv_wrap.cpp index 980b3cb0c..e406f0c79 100644 --- a/aegisub/src/mkv_wrap.cpp +++ b/aegisub/src/mkv_wrap.cpp @@ -199,43 +199,17 @@ void MatroskaWrapper::Parse() { } } - // Copy raw + rawFrames.reserve(frames.size()); + std::copy(frames.begin(), frames.end(), std::back_inserter(rawFrames)); + + // Process timecodes and keyframes + frames.sort(); + int i = 0; for (std::list::iterator cur=frames.begin();cur!=frames.end();cur++) { - rawFrames.push_back(*cur); - } - - bool sortFirst = true; - if (sortFirst) { - // Process timecodes and keyframes - frames.sort(); - MkvFrame curFrame(false,0,0); - int i = 0; - for (std::list::iterator cur=frames.begin();cur!=frames.end();cur++) { - curFrame = *cur; - if (curFrame.isKey) keyFrames.push_back(i); - bytePos.Add(curFrame.filePos); - timecodes.push_back(curFrame.time); - i++; - } - } - - else { - // Process keyframes - MkvFrame curFrame(false,0,0); - int i = 0; - for (std::list::iterator cur=frames.begin();cur!=frames.end();cur++) { - curFrame = *cur; - if (curFrame.isKey) keyFrames.push_back(i); - bytePos.Add(curFrame.filePos); - i++; - } - - // Process timecodes - frames.sort(); - for (std::list::iterator cur=frames.begin();cur!=frames.end();cur++) { - curFrame = *cur; - timecodes.push_back(curFrame.time); - } + if (cur->isKey) keyFrames.push_back(i); + bytePos.Add(cur->filePos); + timecodes.push_back(cur->time); + i++; } } diff --git a/aegisub/src/video_slider.cpp b/aegisub/src/video_slider.cpp index 379bc5e49..6828af349 100644 --- a/aegisub/src/video_slider.cpp +++ b/aegisub/src/video_slider.cpp @@ -346,26 +346,14 @@ void VideoSlider::OnKeyDown(wxKeyEvent &event) { // Snap to keyframe if (shift && !ctrl && !alt) { if (direction != 0) { - // Prepare - int prevKey = 0; - int nextKey = max; - int keys = keyframes.size(); + std::vector::iterator pos = std::lower_bound(keyframes.begin(), keyframes.end(), val); - // Find previous keyframe - // This algorithm does unnecessary loops, but it ensures it works even if keyframes are out of order. - for (int i=0;i prevKey) prevKey = temp; - } + if (direction < 0 && val != 0 && (pos == keyframes.end() || *pos == val)) + --pos; + if (direction > 0 && pos != keyframes.end()) + ++pos; - // Find next keyframe - for (int i=0;i val && temp < nextKey) nextKey = temp; - } - - if (direction == -1) VideoContext::Get()->JumpToFrame(prevKey); - if (direction == 1) VideoContext::Get()->JumpToFrame(nextKey); + VideoContext::Get()->JumpToFrame(pos == keyframes.end() ? max : *pos); return; } }