From a2031cdc62a8527ae5d9a74e02d40217f3b2ac70 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Thu, 22 May 2014 22:19:10 -0700 Subject: [PATCH] scePsmfPlayerGetVideoData() keeps going at end. Even if the video has ended, this happily returns the last frame (with the same pts value) over and over. Audio or no audio. It only returns no data when it's called too early. --- Core/HLE/scePsmf.cpp | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index d5e02306ca..29c09ba5df 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -1493,22 +1493,20 @@ int scePsmfPlayerGetVideoData(u32 psmfPlayer, u32 videoDataAddr) } } - if (!doVideoStep || psmfplayer->mediaengine->stepVideo(videoPixelMode)) { - int displaybufSize = psmfplayer->mediaengine->writeVideoImage(videoData->displaybuf, videoData->frameWidth, videoPixelMode); - gpu->InvalidateCache(videoData->displaybuf, displaybufSize, GPU_INVALIDATE_SAFE); + if (doVideoStep) { + psmfplayer->mediaengine->stepVideo(videoPixelMode); } + + // Always write the video frame, even after the video has ended. + int displaybufSize = psmfplayer->mediaengine->writeVideoImage(videoData->displaybuf, videoData->frameWidth, videoPixelMode); + gpu->InvalidateCache(videoData->displaybuf, displaybufSize, GPU_INVALIDATE_SAFE); __PsmfUpdatePts(psmfplayer, videoData); } _PsmfPlayerFillRingbuffer(psmfplayer); - int ret = psmfplayer->mediaengine->IsVideoEnd() ? (int)ERROR_PSMFPLAYER_NO_MORE_DATA : 0; - DEBUG_LOG(ME, "%08x=scePsmfPlayerGetVideoData(%08x, %08x)", ret, psmfPlayer, videoDataAddr); - if (ret != 0) { - return ret; - } - - return hleDelayResult(ret, "psmfPlayer video decode", 3000); + DEBUG_LOG(ME, "%08x=scePsmfPlayerGetVideoData(%08x, %08x)", 0, psmfPlayer, videoDataAddr); + return hleDelayResult(0, "psmfPlayer video decode", 3000); } int scePsmfPlayerGetAudioData(u32 psmfPlayer, u32 audioDataAddr)