bool VideoDecoder::seekToFrame(uint frame) { if (!isSeekable()) return false; VideoTrack *track = 0; for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) { if ((*it)->getTrackType() == Track::kTrackTypeVideo) { // We only allow seeking by frame when one video track // is present if (track) return false; track = (VideoTrack *)*it; } } // If we didn't find a video track, we can't seek by frame (of course) if (!track) return false; Audio::Timestamp time = track->getFrameTime(frame); if (time < 0) return false; return seek(time); }
bool VideoDecoder::seek(const Audio::Timestamp &time) { if (!isSeekable()) return false; // Stop all tracks so they can be seeked if (isPlaying()) stopAudio(); // Do the actual seeking if (!seekIntern(time)) return false; // Seek any external track too for (TrackListIterator it = _externalTracks.begin(); it != _externalTracks.end(); it++) if (!(*it)->seek(time)) return false; _lastTimeChange = time; // Now that we've seeked, start all tracks again // Also reset our start time if (isPlaying()) { startAudio(); _startTime = g_system->getMillis() - (time.msecs() / _playbackRate).toInt(); } resetPauseStartTime(); findNextVideoTrack(); _needsUpdate = true; return true; }
bool VideoDecoder::seek(const Audio::Timestamp &time) { if (!isSeekable()) return false; // Stop all tracks so they can be seeked if (isPlaying()) stopAudio(); for (TrackList::iterator it = _tracks.begin(); it != _tracks.end(); it++) if (!(*it)->seek(time)) return false; _lastTimeChange = time; // Now that we've seeked, start all tracks again // Also reset our start time if (isPlaying()) { startAudio(); _startTime = g_system->getMillis() - time.msecs(); } resetPauseStartTime(); _needsUpdate = true; return true; }
bool Controller::enableJack(bool enable) { if (!m_consumer) return true; if (enable && !m_jackFilter) { m_jackFilter = new Mlt::Filter(profile(), "jackrack"); if (m_jackFilter->is_valid()) { m_consumer->attach(*m_jackFilter); m_consumer->set("audio_off", 1); if (isSeekable()) { m_jackFilter->listen("jack-started", this, (mlt_listener) on_jack_started); m_jackFilter->listen("jack-stopped", this, (mlt_listener) on_jack_stopped); } } else { delete m_jackFilter; m_jackFilter = 0; return false; } } else if (!enable && m_jackFilter) { m_consumer->detach(*m_jackFilter); delete m_jackFilter; m_jackFilter = 0; m_consumer->set("audio_off", 0); m_consumer->stop(); m_consumer->start(); } return true; }
bool VideoDecoder::Track::isRewindable() const { return isSeekable(); }
bool Controller::isSeekableClip() { return isClip() && isSeekable(); }