bool VideoPlayer::reopenVideo(Video &video) { if (video.isEmpty()) return true; if (video.fileName.empty()) { video.close(); return false; } Properties properties; properties.type = video.properties.type; Common::String fileName = findFile(video.fileName, properties); if (fileName.empty()) { video.close(); return false; } Common::SeekableReadStream *stream = _vm->_dataIO->getFile(fileName); if (!stream) { video.close(); return false; } if (!video.decoder->reloadStream(stream)) { delete stream; return false; } return true; }
int VideoPlayer::openVideo(bool primary, const Common::String &file, Properties &properties) { int slot = 0; Video *video = 0; if (!primary) { slot = getNextFreeSlot(); if (slot < 0) { warning("VideoPlayer::openVideo(): Can't open video \"%s\": No free slot", file.c_str()); return -1; } video = &_videoSlots[slot]; } else video = &_videoSlots[0]; // Different video already in the slot => close that video if (!video->isEmpty() && (video->fileName.compareToIgnoreCase(file) != 0)) video->close(); // No video => load the requested file if (video->isEmpty()) { // Open the video if (!(video->decoder = openVideo(file, properties))) return -1; if (video->decoder->hasVideo() && !(properties.flags & kFlagNoVideo) && (video->decoder->isPaletted() != !_vm->isTrueColor())) { if (!properties.switchColorMode) return -1; _vm->setTrueColor(!video->decoder->isPaletted()); video->decoder->colorModeChanged(); } // Set the filename video->fileName = file; // WORKAROUND: In some rare cases, the cursor should still be // displayed while a video is playing. _noCursorSwitch = false; if (primary && (_vm->getGameType() == kGameTypeLostInTime)) { if (!file.compareToIgnoreCase("PORTA03") || !file.compareToIgnoreCase("PORTA03A") || !file.compareToIgnoreCase("CALE1") || !file.compareToIgnoreCase("AMIL2") || !file.compareToIgnoreCase("AMIL3B") || !file.compareToIgnoreCase("DELB")) _noCursorSwitch = true; } // WORKAROUND: In Woodruff, Coh Cott vanished in one video on her party. // This is a bug in video, so we work around it. _woodruffCohCottWorkaround = false; if (primary && (_vm->getGameType() == kGameTypeWoodruff)) { if (!file.compareToIgnoreCase("SQ32-03")) _woodruffCohCottWorkaround = true; } if (!(properties.flags & kFlagNoVideo) && (properties.sprite >= 0)) { bool ownSurf = (properties.sprite != Draw::kFrontSurface) && (properties.sprite != Draw::kBackSurface); bool screenSize = properties.flags & kFlagScreenSurface; if (ownSurf) { _vm->_draw->_spritesArray[properties.sprite] = _vm->_video->initSurfDesc(screenSize ? _vm->_width : video->decoder->getWidth(), screenSize ? _vm->_height : video->decoder->getHeight(), 0); } if (!_vm->_draw->_spritesArray[properties.sprite] && (properties.sprite != Draw::kFrontSurface) && (properties.sprite != Draw::kBackSurface)) { properties.sprite = -1; video->surface.reset(); video->decoder->setSurfaceMemory(); properties.x = properties.y = 0; } else { video->surface = _vm->_draw->_spritesArray[properties.sprite]; if (properties.sprite == Draw::kFrontSurface) video->surface = _vm->_draw->_frontSurface; if (properties.sprite == Draw::kBackSurface) video->surface = _vm->_draw->_backSurface; video->decoder->setSurfaceMemory(video->surface->getData(), video->surface->getWidth(), video->surface->getHeight(), video->surface->getBPP()); if (!ownSurf || (ownSurf && screenSize)) { if ((properties.x >= 0) || (properties.y >= 0)) { properties.x = (properties.x < 0) ? 0xFFFF : properties.x; properties.y = (properties.y < 0) ? 0xFFFF : properties.y; } else properties.x = properties.y = -1; } else properties.x = properties.y = 0; } } else { properties.sprite = -1; video->surface.reset(); video->decoder->setSurfaceMemory(); properties.x = properties.y = 0; } } video->decoder->setXY(properties.x, properties.y); if (primary) _needBlit = (properties.flags & kFlagUseBackSurfaceContent) && (properties.sprite == Draw::kFrontSurface); properties.hasSound = video->decoder->hasSound(); if (!video->decoder->hasSound()) video->decoder->setFrameRate(_vm->_util->getFrameRate()); WRITE_VAR(7, video->decoder->getFrameCount()); return slot; }