From 3fbab33c919a897cf2890c8fe0240c3b0ba6aeb7 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 17 Aug 2014 15:46:04 -0700 Subject: [PATCH] Only loop at video end. In case of a short video that runs out of data but isn't ready to loop yet. --- Core/HLE/scePsmf.cpp | 19 +++++++++++++------ Core/HW/MediaEngine.cpp | 7 ++++++- Core/HW/MediaEngine.h | 1 + 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 09735e323a..3bf2e907d5 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -233,6 +233,12 @@ public: } } + bool HasReachedEnd() { + bool videoPtsEnd = (s64)psmfPlayerAvcAu.pts >= (s64)totalDurationTimestamp - VIDEO_FRAME_DURATION_TS; + // If we're out of video data and have no audio, it's over even if the pts isn't there yet. + return videoPtsEnd || (mediaengine->IsVideoEnd() && mediaengine->IsNoAudioData()); + } + u32 filehandle; u32 fileoffset; int readSize; @@ -1084,10 +1090,12 @@ int _PsmfPlayerFillRingbuffer(PsmfPlayer *psmfplayer) { } while (size > 0); if (psmfplayer->readSize >= psmfplayer->streamSize && videoLoopStatus == PSMF_PLAYER_CONFIG_LOOP) { - // start looping - psmfplayer->readSize = 0; - pspFileSystem.SeekFile(psmfplayer->filehandle, psmfplayer->fileoffset, FILEMOVE_BEGIN); - psmfplayer->mediaengine->loadStream(psmfplayer->mediaengine->m_mpegheader, 2048, psmfplayer->mediaengine->m_ringbuffersize); + // Start looping, but only if we've finished. + if (psmfplayer->HasReachedEnd()) { + psmfplayer->readSize = 0; + pspFileSystem.SeekFile(psmfplayer->filehandle, psmfplayer->fileoffset, FILEMOVE_BEGIN); + psmfplayer->mediaengine->reloadStream(); + } } return 0; } @@ -1415,8 +1423,7 @@ int scePsmfPlayerUpdate(u32 psmfPlayer) } DEBUG_LOG(ME, "scePsmfPlayerUpdate(%08x)", psmfPlayer); - bool videoPtsEnd = (s64)psmfplayer->psmfPlayerAvcAu.pts >= (s64)psmfplayer->totalDurationTimestamp - VIDEO_FRAME_DURATION_TS; - if (videoPtsEnd || (psmfplayer->mediaengine->IsVideoEnd() && psmfplayer->mediaengine->IsNoAudioData())) { + if (psmfplayer->HasReachedEnd()) { if (videoLoopStatus == PSMF_PLAYER_CONFIG_NO_LOOP && psmfplayer->videoStep >= 1) { if (psmfplayer->status != PSMF_PLAYER_STATUS_PLAYING_FINISHED) { psmfplayer->ScheduleFinish(psmfPlayer); diff --git a/Core/HW/MediaEngine.cpp b/Core/HW/MediaEngine.cpp index 57a9ec4dc2..27c24e8521 100644 --- a/Core/HW/MediaEngine.cpp +++ b/Core/HW/MediaEngine.cpp @@ -193,7 +193,7 @@ void MediaEngine::DoState(PointerWrap &p){ u32 hasloadStream = m_pdata != NULL; p.Do(hasloadStream); if (hasloadStream && p.mode == p.MODE_READ) - loadStream(m_mpegheader, 2048, m_ringbuffersize); + reloadStream(); #ifdef USE_FFMPEG u32 hasopencontext = m_pFormatCtx != NULL; #else @@ -340,6 +340,11 @@ bool MediaEngine::loadStream(const u8 *buffer, int readSize, int RingbufferSize) return true; } +bool MediaEngine::reloadStream() +{ + return loadStream(m_mpegheader, 2048, m_ringbuffersize); +} + int MediaEngine::addStreamData(const u8 *buffer, int addSize) { int size = addSize; if (size > 0 && m_pdata) { diff --git a/Core/HW/MediaEngine.h b/Core/HW/MediaEngine.h index bf1745630f..363a3c07d3 100644 --- a/Core/HW/MediaEngine.h +++ b/Core/HW/MediaEngine.h @@ -60,6 +60,7 @@ public: void closeMedia(); bool loadStream(const u8 *buffer, int readSize, int RingbufferSize); + bool reloadStream(); // open the mpeg context bool openContext(); void closeContext();