void VideoDecoder::setRate(const Common::Rational &rate) { if (!isVideoLoaded() || _playbackRate == rate) return; if (rate == 0) { stop(); return; } else if (rate != 1 && hasAudio()) { warning("Cannot set custom rate in videos with audio"); return; } Common::Rational targetRate = rate; if (rate < 0) { // TODO: Implement support for this warning("Cannot set custom rate to backwards"); targetRate = 1; if (_playbackRate == targetRate) return; } if (_playbackRate != 0) _lastTimeChange = getTime(); _playbackRate = targetRate; _startTime = g_system->getMillis(); // Adjust start time if we've seeked to something besides zero time if (_lastTimeChange.totalNumberOfFrames() != 0) _startTime -= (_lastTimeChange.msecs() / _playbackRate).toInt(); startAudio(); }
void MoviePlayer::handleNextFrame() { if (!isVideoLoaded()) return; VirtScreen *pvs = &_vm->_virtscr[kMainVirtScreen]; if (_flags & 2) { uint8 *dstPtr = _vm->getResourceAddress(rtImage, _wizResNum); assert(dstPtr); uint8 *dst = _vm->findWrappedBlock(MKID_BE('WIZD'), dstPtr, 0, 0); assert(dst); copyFrameToBuffer(dst, kDstResource, 0, 0, _vm->_screenWidth * _vm->_bytesPerPixel); } else if (_flags & 1) { copyFrameToBuffer(pvs->getBackPixels(0, 0), kDstScreen, 0, 0, pvs->pitch); Common::Rect imageRect(getWidth(), getHeight()); _vm->restoreBackgroundHE(imageRect); } else { copyFrameToBuffer(pvs->getPixels(0, 0), kDstScreen, 0, 0, pvs->pitch); Common::Rect imageRect(getWidth(), getHeight()); _vm->markRectAsDirty(kMainVirtScreen, imageRect); } if (endOfVideo()) close(); }
bool VideoDecoder::isSeekable() const { if (!isVideoLoaded()) return false; for (TrackList::const_iterator it = _tracks.begin(); it != _tracks.end(); it++) if (!(*it)->isSeekable()) return false; return true; }
bool QuickTimeDecoder::endOfVideo() const { if (!isVideoLoaded()) return true; for (uint32 i = 0; i < _handlers.size(); i++) if (!_handlers[i]->endOfTrack()) return false; return true; }
bool VideoDecoder::addStreamFileTrack(const Common::String &baseName) { // Only allow adding external tracks if a video is already loaded if (!isVideoLoaded()) return false; StreamFileAudioTrack *track = new StreamFileAudioTrack(); bool result = track->loadFromFile(baseName); if (result) addTrack(track); return result; }
int MoviePlayer::load(const char *filename, int flags, int image) { if (isVideoLoaded()) close(); if (!loadFile(filename)) { warning("Failed to load video file %s", filename); return -1; } debug(1, "Playing video %s", filename); if (flags & 2) _vm->_wiz->createWizEmptyImage(image, 0, 0, getWidth(), getHeight()); _flags = flags; _wizResNum = image; return 0; }
void NeverhoodSmackerDecoder::forceSeekToFrame(uint frame) { if (!isVideoLoaded()) return; if (frame >= getFrameCount()) error("Can't force Smacker seek to invalid frame %d", frame); if (_header.audioInfo[0].hasAudio) error("Can't force Smacker frame seek with audio"); if (!rewind()) error("Failed to rewind"); SmackerVideoTrack *videoTrack = (SmackerVideoTrack *)getTrack(0); uint32 offset = 0; for (uint32 i = 0; i < frame; i++) { videoTrack->increaseCurFrame(); offset += _frameSizes[i] & ~3; } _fileStream->seek(offset, SEEK_CUR); }
void VideoDecoder::setRate(const Common::Rational &rate) { if (!isVideoLoaded() || _playbackRate == rate) return; if (rate == 0) { stop(); return; } else if (rate != 1 && hasAudio()) { warning("Cannot set custom rate in videos with audio"); return; } Common::Rational targetRate = rate; // Attempt to set the reverse if (!setReverse(rate < 0)) { assert(rate < 0); // We shouldn't fail for forward. warning("Cannot set custom rate to backwards"); setReverse(false); targetRate = 1; if (_playbackRate == targetRate) return; } if (_playbackRate != 0) _lastTimeChange = getTime(); _playbackRate = targetRate; _startTime = g_system->getMillis(); // Adjust start time if we've seeked to something besides zero time if (_lastTimeChange != 0) _startTime -= (_lastTimeChange.msecs() / _playbackRate).toInt(); startAudio(); }
int MoviePlayer::getImageNum() { if (!isVideoLoaded()) return 0; return _wizResNum; }
bool AVIDecoder::isSeekable() const { // Only videos with an index can seek // Anyone else who wants to seek is crazy. return isVideoLoaded() && !_indexEntries.empty(); }
bool VideoDecoder::endOfVideo() const { return !isVideoLoaded() || (getCurFrame() >= (int32)getFrameCount() - 1); }