diff --git a/video/video_decoder.cpp b/video/video_decoder.cpp index c6171c445005..dce96aae031b 100644 --- a/video/video_decoder.cpp +++ b/video/video_decoder.cpp @@ -778,6 +778,31 @@ void VideoDecoder::setEndTime(const Audio::Timestamp &endTime) { } } +void VideoDecoder::setEndFrame(uint frame) { + VideoTrack *track = 0; + + for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) { + if ((*it)->getTrackType() == Track::kTrackTypeVideo) { + // We only allow this when one video track is present + if (track) + return; + + track = (VideoTrack *)*it; + } + } + + // If we didn't find a video track, we can't set the final frame (of course) + if (!track) + return; + + Audio::Timestamp time = track->getFrameTime(frame + 1); + + if (time < 0) + return; + + setEndTime(time); +} + VideoDecoder::Track *VideoDecoder::getTrack(uint track) { if (track > _internalTracks.size()) return 0; diff --git a/video/video_decoder.h b/video/video_decoder.h index 2faec0fb3eb6..c3879e914470 100644 --- a/video/video_decoder.h +++ b/video/video_decoder.h @@ -213,6 +213,17 @@ class VideoDecoder { */ void setEndTime(const Audio::Timestamp &endTime); + /** + * Set the end frame. + * + * The passed frame will be the last frame to show. + * + * Like seekToFrame(), this only works when one video track is present, + * and that track supports getFrameTime(). This calls setEndTime() + * internally. + */ + void setEndFrame(uint frame); + /** * Get the stop time of the video (if not set, zero) */