mirror of
https://github.com/OpenMW/openmw.git
synced 2025-07-04 06:11:34 +00:00
Videoplayer: wait until we have the first picture before returning from playVideo()
This commit is contained in:
parent
55c9c0a266
commit
6126b3b84a
2 changed files with 23 additions and 25 deletions
|
@ -31,6 +31,13 @@ void VideoPlayer::playVideo(const std::string &resourceName)
|
||||||
mState = new VideoState;
|
mState = new VideoState;
|
||||||
mState->setAudioFactory(mAudioFactory.get());
|
mState->setAudioFactory(mAudioFactory.get());
|
||||||
mState->init(resourceName);
|
mState->init(resourceName);
|
||||||
|
|
||||||
|
// wait until we have the first picture
|
||||||
|
while (mState->video_st && mState->mTexture.isNull())
|
||||||
|
{
|
||||||
|
if (!mState->update())
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
catch(std::exception& e) {
|
catch(std::exception& e) {
|
||||||
std::cerr<< "Failed to play video: "<<e.what() <<std::endl;
|
std::cerr<< "Failed to play video: "<<e.what() <<std::endl;
|
||||||
|
|
41
extern/ogre-ffmpeg-videoplayer/videostate.cpp
vendored
41
extern/ogre-ffmpeg-videoplayer/videostate.cpp
vendored
|
@ -207,14 +207,17 @@ void VideoState::video_display(VideoPicture *vp)
|
||||||
{
|
{
|
||||||
if((*this->video_st)->codec->width != 0 && (*this->video_st)->codec->height != 0)
|
if((*this->video_st)->codec->width != 0 && (*this->video_st)->codec->height != 0)
|
||||||
{
|
{
|
||||||
|
if (mTexture.isNull())
|
||||||
if(static_cast<int>(mTexture->getWidth()) != (*this->video_st)->codec->width ||
|
|
||||||
static_cast<int>(mTexture->getHeight()) != (*this->video_st)->codec->height)
|
|
||||||
{
|
{
|
||||||
mTexture->unload();
|
static int i = 0;
|
||||||
mTexture->setWidth((*this->video_st)->codec->width);
|
mTexture = Ogre::TextureManager::getSingleton().createManual(
|
||||||
mTexture->setHeight((*this->video_st)->codec->height);
|
"ffmpeg/VideoTexture" + Ogre::StringConverter::toString(++i),
|
||||||
mTexture->createInternalResources();
|
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
|
||||||
|
Ogre::TEX_TYPE_2D,
|
||||||
|
(*this->video_st)->codec->width, (*this->video_st)->codec->height,
|
||||||
|
0,
|
||||||
|
Ogre::PF_BYTE_RGBA,
|
||||||
|
Ogre::TU_DYNAMIC_WRITE_ONLY_DISCARDABLE);
|
||||||
}
|
}
|
||||||
Ogre::PixelBox pb((*this->video_st)->codec->width, (*this->video_st)->codec->height, 1, Ogre::PF_BYTE_RGBA, &vp->data[0]);
|
Ogre::PixelBox pb((*this->video_st)->codec->width, (*this->video_st)->codec->height, 1, Ogre::PF_BYTE_RGBA, &vp->data[0]);
|
||||||
Ogre::HardwarePixelBufferSharedPtr buffer = mTexture->getBuffer();
|
Ogre::HardwarePixelBufferSharedPtr buffer = mTexture->getBuffer();
|
||||||
|
@ -657,24 +660,6 @@ void VideoState::init(const std::string& resourceName)
|
||||||
if(video_index >= 0)
|
if(video_index >= 0)
|
||||||
{
|
{
|
||||||
this->stream_open(video_index, this->format_ctx);
|
this->stream_open(video_index, this->format_ctx);
|
||||||
|
|
||||||
int width = (*this->video_st)->codec->width;
|
|
||||||
int height = (*this->video_st)->codec->height;
|
|
||||||
static int i = 0;
|
|
||||||
this->mTexture = Ogre::TextureManager::getSingleton().createManual(
|
|
||||||
"ffmpeg/VideoTexture" + Ogre::StringConverter::toString(++i),
|
|
||||||
Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
|
|
||||||
Ogre::TEX_TYPE_2D,
|
|
||||||
width, height,
|
|
||||||
0,
|
|
||||||
Ogre::PF_BYTE_RGBA,
|
|
||||||
Ogre::TU_DYNAMIC_WRITE_ONLY_DISCARDABLE);
|
|
||||||
|
|
||||||
// initialize to (0,0,0,0)
|
|
||||||
std::vector<Ogre::uint32> buffer;
|
|
||||||
buffer.resize(width * height, 0);
|
|
||||||
Ogre::PixelBox pb(width, height, 1, Ogre::PF_BYTE_RGBA, &buffer[0]);
|
|
||||||
this->mTexture->getBuffer()->blitFromMemory(pb);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -724,6 +709,12 @@ void VideoState::deinit()
|
||||||
}
|
}
|
||||||
avformat_close_input(&this->format_ctx);
|
avformat_close_input(&this->format_ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!mTexture.isNull())
|
||||||
|
{
|
||||||
|
Ogre::TextureManager::getSingleton().remove(mTexture->getName());
|
||||||
|
mTexture.setNull();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
double VideoState::get_external_clock()
|
double VideoState::get_external_clock()
|
||||||
|
|
Loading…
Reference in a new issue