From 9c0bc32f52ac4e65edb09bac705ee7ce075e03c6 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 5 May 2014 01:24:31 -0700 Subject: [PATCH] Add support for initPts in scePsmfPlayerStart(). It won't be super speedy though, could more ideally do it on the calls to Update()... --- Core/HLE/scePsmf.cpp | 9 ++++++++- Core/HW/MediaEngine.cpp | 40 +++++++++++++++++++++++++++++++++------- Core/HW/MediaEngine.h | 2 ++ Core/HW/MpegDemux.cpp | 4 +++- 4 files changed, 46 insertions(+), 9 deletions(-) diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index a82fdeb893..e428446edc 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -1232,6 +1232,13 @@ int scePsmfPlayerStart(u32 psmfPlayer, u32 psmfPlayerData, int initPts) psmfplayer->status = PSMF_PLAYER_STATUS_PLAYING; psmfplayer->mediaengine->openContext(); + // TODO: It would be better to spread this out into the Update() calls. + while (!psmfplayer->mediaengine->seekTo(initPts, videoPixelMode)) { + _PsmfPlayerFillRingbuffer(psmfplayer); + if (psmfplayer->mediaengine->IsVideoEnd()) { + break; + } + } return 0; } @@ -1555,7 +1562,7 @@ u32 scePsmfPlayerGetCurrentAudioStream(u32 psmfPlayer, u32 audioCodecAddr, u32 a PsmfPlayer *psmfplayer = getPsmfPlayer(psmfPlayer); if (!psmfplayer) { ERROR_LOG(ME, "scePsmfPlayerGetCurrentAudioStream(%08x, %08x, %08x): invalid psmf player", psmfPlayer, audioCodecAddr, audioStreamNumAddr); - return ERROR_PSMF_NOT_FOUND; + return ERROR_PSMFPLAYER_INVALID_STATUS; } if (psmfplayer->status == PSMF_PLAYER_STATUS_INIT) { ERROR_LOG(ME, "scePsmfPlayerGetCurrentVideoStream(%08x): psmf not yet set", psmfPlayer); diff --git a/Core/HW/MediaEngine.cpp b/Core/HW/MediaEngine.cpp index e0bd974679..44c55a3106 100644 --- a/Core/HW/MediaEngine.cpp +++ b/Core/HW/MediaEngine.cpp @@ -359,6 +359,28 @@ int MediaEngine::addStreamData(u8* buffer, int addSize) { return size; } +bool MediaEngine::seekTo(s64 timestamp, int videoPixelMode) { + if (timestamp <= 0) { + return true; + } + + // Just doing it the not so great way to be sure audio is in sync. + int timeout = 1000; + while (getVideoTimeStamp() < timestamp - 3003) { + if (getAudioTimeStamp() < getVideoTimeStamp()) { + getNextAudioFrame(NULL, NULL, NULL); + } + if (!stepVideo(videoPixelMode)) { + return false; + } + if (--timeout <= 0) { + return true; + } + } + + return true; +} + bool MediaEngine::setVideoStream(int streamNum, bool force) { if (m_videoStream == streamNum && !force) { // Yay, nothing to do. @@ -733,6 +755,16 @@ int MediaEngine::getAudioRemainSize() { return m_demux->getRemainSize(); } +int MediaEngine::getNextAudioFrame(u8 **buf, int *headerCode1, int *headerCode2) { + // When getting a frame, increment pts + m_audiopts += 4180; + + // Demux now (rather than on add data) so that we select the right stream. + m_demux->demux(m_audioStream); + + return m_demux->getNextAudioFrame(buf, headerCode1, headerCode2); +} + int MediaEngine::getAudioSamples(u32 bufferPtr) { if (!Memory::IsValidAddress(bufferPtr)) { ERROR_LOG_REPORT(ME, "Ignoring bad audio decode address %08x during video playback", bufferPtr); @@ -743,15 +775,9 @@ int MediaEngine::getAudioSamples(u32 bufferPtr) { return 0; } - // When getting a frame, increment pts - m_audiopts += 4180; - - // Demux now (rather than on add data) so that we select the right stream. - m_demux->demux(m_audioStream); - u8 *audioFrame = 0; int headerCode1, headerCode2; - int frameSize = m_demux->getNextAudioFrame(&audioFrame, &headerCode1, &headerCode2); + int frameSize = getNextAudioFrame(&audioFrame, &headerCode1, &headerCode2); if (frameSize == 0) { return 0; } diff --git a/Core/HW/MediaEngine.h b/Core/HW/MediaEngine.h index 378ba18537..f749bb1d5f 100644 --- a/Core/HW/MediaEngine.h +++ b/Core/HW/MediaEngine.h @@ -66,6 +66,7 @@ public: // Returns number of packets actually added. I guess the buffer might be full. int addStreamData(u8* buffer, int addSize); + bool seekTo(s64 timestamp, int videoPixelMode); bool setVideoStream(int streamNum, bool force = false); // TODO: Return false if the stream doesn't exist. @@ -93,6 +94,7 @@ public: private: void updateSwsFormat(int videoPixelMode); + int getNextAudioFrame(u8 **buf, int *headerCode1, int *headerCode2); public: // TODO: Very little of this below should be public. diff --git a/Core/HW/MpegDemux.cpp b/Core/HW/MpegDemux.cpp index 02b39ba142..f346c3e84b 100644 --- a/Core/HW/MpegDemux.cpp +++ b/Core/HW/MpegDemux.cpp @@ -248,7 +248,9 @@ int MpegDemux::getNextAudioFrame(u8 **buf, int *headerCode1, int *headerCode2) audioPos = gotsize; } m_audioStream.pop_front(0, audioPos); - *buf = m_audioFrame + 8; + if (buf) { + *buf = m_audioFrame + 8; + } return frameSize - 8; }