From 5be3a6e7488b2f4795460c040d2881e39b285c11 Mon Sep 17 00:00:00 2001 From: oioitff Date: Sat, 8 Jun 2013 00:27:31 +0800 Subject: [PATCH] PsmfPlayer seems to step video and sync in scePsmfPlayerGetVideoData. --- Core/HLE/scePsmf.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Core/HLE/scePsmf.cpp b/Core/HLE/scePsmf.cpp index 9624b7eb96..8a2ac14515 100644 --- a/Core/HLE/scePsmf.cpp +++ b/Core/HLE/scePsmf.cpp @@ -849,11 +849,7 @@ int scePsmfPlayerUpdate(u32 psmfPlayer) psmfplayer->status = PSMF_PLAYER_STATUS_PLAYING_FINISHED; } } - // TODO: Once we start increasing pts somewhere, and actually know the last timestamp, do this better. - psmfplayer->mediaengine->stepVideo(videoPixelMode); - psmfplayer->psmfPlayerAvcAu.pts = psmfplayer->mediaengine->getVideoTimeStamp(); - // This seems to be crazy! - return hleDelayResult(0, "psmfPlayer update", 30000); + return 0; } int scePsmfPlayerReleasePsmf(u32 psmfPlayer) @@ -878,12 +874,16 @@ int scePsmfPlayerGetVideoData(u32 psmfPlayer, u32 videoDataAddr) int frameWidth = Memory::Read_U32(videoDataAddr); u32 displaybuf = Memory::Read_U32(videoDataAddr + 4); int displaypts = Memory::Read_U32(videoDataAddr + 8); - - psmfplayer->mediaengine->writeVideoImage(Memory::GetPointer(displaybuf), frameWidth, videoPixelMode); - + if (psmfplayer->mediaengine->stepVideo(videoPixelMode)) + psmfplayer->mediaengine->writeVideoImage(Memory::GetPointer(displaybuf), frameWidth, videoPixelMode); + psmfplayer->psmfPlayerAvcAu.pts = psmfplayer->mediaengine->getVideoTimeStamp(); Memory::Write_U32(psmfplayer->psmfPlayerAvcAu.pts, videoDataAddr + 8); } - return hleDelayResult(0, "psmfPlayer video decode", 3000); + s64 deltapts = psmfplayer->mediaengine->getVideoTimeStamp() - psmfplayer->mediaengine->getAudioTimeStamp(); + int delaytime = 3000; + if (deltapts > 0) + delaytime = deltapts * 1000000 / 90000; + return hleDelayResult(0, "psmfPlayer video decode", delaytime); } int scePsmfPlayerGetAudioData(u32 psmfPlayer, u32 audioDataAddr)