mirror of
https://github.com/hrydgard/ppsspp.git
synced 2025-04-02 11:01:50 -04:00
Fix video playback in LocoRoco 2. scePsmfPlayerGetInfo had a couple more parameters.
Fixes #7887.
This commit is contained in:
parent
a362af74c0
commit
e9d5eb694b
1 changed files with 29 additions and 6 deletions
|
@ -25,6 +25,7 @@
|
||||||
#include "Core/HLE/FunctionWrappers.h"
|
#include "Core/HLE/FunctionWrappers.h"
|
||||||
#include "Core/HLE/scePsmf.h"
|
#include "Core/HLE/scePsmf.h"
|
||||||
#include "Core/HLE/sceMpeg.h"
|
#include "Core/HLE/sceMpeg.h"
|
||||||
|
#include "Core/HLE/sceKernelMemory.h"
|
||||||
#include "Core/HW/MediaEngine.h"
|
#include "Core/HW/MediaEngine.h"
|
||||||
#include "GPU/GPUInterface.h"
|
#include "GPU/GPUInterface.h"
|
||||||
#include "GPU/GPUState.h"
|
#include "GPU/GPUState.h"
|
||||||
|
@ -206,7 +207,7 @@ public:
|
||||||
class PsmfPlayer {
|
class PsmfPlayer {
|
||||||
public:
|
public:
|
||||||
// For savestates only.
|
// For savestates only.
|
||||||
PsmfPlayer() : filehandle(0), finishThread(nullptr) {
|
PsmfPlayer() : filehandle(0), finishThread(nullptr), videoWidth(480), videoHeight(272) {
|
||||||
mediaengine = new MediaEngine();
|
mediaengine = new MediaEngine();
|
||||||
}
|
}
|
||||||
PsmfPlayer(const PsmfPlayerCreateData *data);
|
PsmfPlayer(const PsmfPlayerCreateData *data);
|
||||||
|
@ -260,6 +261,9 @@ public:
|
||||||
int warmUp;
|
int warmUp;
|
||||||
s64 seekDestTimeStamp;
|
s64 seekDestTimeStamp;
|
||||||
|
|
||||||
|
int videoWidth;
|
||||||
|
int videoHeight;
|
||||||
|
|
||||||
SceMpegAu psmfPlayerAtracAu;
|
SceMpegAu psmfPlayerAtracAu;
|
||||||
SceMpegAu psmfPlayerAvcAu;
|
SceMpegAu psmfPlayerAvcAu;
|
||||||
PsmfPlayerStatus status;
|
PsmfPlayerStatus status;
|
||||||
|
@ -411,7 +415,7 @@ PsmfPlayer::PsmfPlayer(const PsmfPlayerCreateData *data) {
|
||||||
playSpeed = 1;
|
playSpeed = 1;
|
||||||
totalDurationTimestamp = 0;
|
totalDurationTimestamp = 0;
|
||||||
status = PSMF_PLAYER_STATUS_INIT;
|
status = PSMF_PLAYER_STATUS_INIT;
|
||||||
mediaengine = new MediaEngine;
|
mediaengine = new MediaEngine();
|
||||||
finishThread = nullptr;
|
finishThread = nullptr;
|
||||||
filehandle = 0;
|
filehandle = 0;
|
||||||
fileoffset = 0;
|
fileoffset = 0;
|
||||||
|
@ -480,7 +484,7 @@ void Psmf::DoState(PointerWrap &p) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PsmfPlayer::DoState(PointerWrap &p) {
|
void PsmfPlayer::DoState(PointerWrap &p) {
|
||||||
auto s = p.Section("PsmfPlayer", 1, 7);
|
auto s = p.Section("PsmfPlayer", 1, 8);
|
||||||
if (!s)
|
if (!s)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -549,6 +553,11 @@ void PsmfPlayer::DoState(PointerWrap &p) {
|
||||||
} else {
|
} else {
|
||||||
finishThread = NULL;
|
finishThread = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (s >= 8) {
|
||||||
|
p.Do(videoWidth);
|
||||||
|
p.Do(videoHeight);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Psmf::setStreamNum(u32 psmfStruct, int num, bool updateCached) {
|
bool Psmf::setStreamNum(u32 psmfStruct, int num, bool updateCached) {
|
||||||
|
@ -1217,6 +1226,9 @@ static int _PsmfPlayerSetPsmfOffset(u32 psmfPlayer, const char *filename, int of
|
||||||
|
|
||||||
psmfplayer->totalVideoStreams = 0;
|
psmfplayer->totalVideoStreams = 0;
|
||||||
psmfplayer->totalAudioStreams = 0;
|
psmfplayer->totalAudioStreams = 0;
|
||||||
|
psmfplayer->videoWidth = buf[142] * 16;
|
||||||
|
psmfplayer->videoHeight = buf[143] * 16;
|
||||||
|
|
||||||
psmfplayer->playerVersion = PSMF_PLAYER_VERSION_FULL;
|
psmfplayer->playerVersion = PSMF_PLAYER_VERSION_FULL;
|
||||||
for (u16 i = 0; i < numStreams; i++) {
|
for (u16 i = 0; i < numStreams; i++) {
|
||||||
const u8 *currentStreamAddr = buf + 0x82 + i * 16;
|
const u8 *currentStreamAddr = buf + 0x82 + i * 16;
|
||||||
|
@ -1725,8 +1737,7 @@ static u32 scePsmfPlayerGetCurrentPts(u32 psmfPlayer, u32 currentPtsAddr)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u32 scePsmfPlayerGetPsmfInfo(u32 psmfPlayer, u32 psmfInfoAddr)
|
static u32 scePsmfPlayerGetPsmfInfo(u32 psmfPlayer, u32 psmfInfoAddr, u32 widthAddr, u32 heightAddr) {
|
||||||
{
|
|
||||||
auto info = PSPPointer<PsmfInfo>::Create(psmfInfoAddr);
|
auto info = PSPPointer<PsmfInfo>::Create(psmfInfoAddr);
|
||||||
if (!Memory::IsValidAddress(psmfPlayer) || !info.IsValid()) {
|
if (!Memory::IsValidAddress(psmfPlayer) || !info.IsValid()) {
|
||||||
ERROR_LOG(ME, "scePsmfPlayerGetPsmfInfo(%08x, %08x): invalid addresses", psmfPlayer, psmfInfoAddr);
|
ERROR_LOG(ME, "scePsmfPlayerGetPsmfInfo(%08x, %08x): invalid addresses", psmfPlayer, psmfInfoAddr);
|
||||||
|
@ -1753,6 +1764,18 @@ static u32 scePsmfPlayerGetPsmfInfo(u32 psmfPlayer, u32 psmfInfoAddr)
|
||||||
info->numPCMStreams = 0;
|
info->numPCMStreams = 0;
|
||||||
info->playerVersion = psmfplayer->playerVersion;
|
info->playerVersion = psmfplayer->playerVersion;
|
||||||
|
|
||||||
|
if (psmfPlayerLibVersion >= 0x03090510) {
|
||||||
|
// LocoRoco 2 depends on these for sizing its video output. Without this, its height is zero
|
||||||
|
// and nothing is drawn.
|
||||||
|
// Can't ask mediaengine for width/height here, it's too early, so we grabbed it from the
|
||||||
|
// header in scePsmfPlayerSetPsmf.
|
||||||
|
if (Memory::IsValidAddress(widthAddr) && psmfplayer->videoWidth) {
|
||||||
|
Memory::Write_U32(psmfplayer->videoWidth, widthAddr);
|
||||||
|
}
|
||||||
|
if (Memory::IsValidAddress(heightAddr) && psmfplayer->videoHeight) {
|
||||||
|
Memory::Write_U32(psmfplayer->videoHeight, heightAddr);
|
||||||
|
}
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2123,7 +2146,7 @@ const HLEFunction scePsmfPlayer[] =
|
||||||
{0XA3D81169, &WrapU_UII<scePsmfPlayerChangePlayMode>, "scePsmfPlayerChangePlayMode", 'x', "xii"},
|
{0XA3D81169, &WrapU_UII<scePsmfPlayerChangePlayMode>, "scePsmfPlayerChangePlayMode", 'x', "xii"},
|
||||||
{0XB8D10C56, &WrapU_U<scePsmfPlayerSelectAudio>, "scePsmfPlayerSelectAudio", 'x', "x" },
|
{0XB8D10C56, &WrapU_U<scePsmfPlayerSelectAudio>, "scePsmfPlayerSelectAudio", 'x', "x" },
|
||||||
{0XB9848A74, &WrapI_UU<scePsmfPlayerGetAudioData>, "scePsmfPlayerGetAudioData", 'i', "xx" },
|
{0XB9848A74, &WrapI_UU<scePsmfPlayerGetAudioData>, "scePsmfPlayerGetAudioData", 'i', "xx" },
|
||||||
{0XDF089680, &WrapU_UU<scePsmfPlayerGetPsmfInfo>, "scePsmfPlayerGetPsmfInfo", 'x', "xx" },
|
{0XDF089680, &WrapU_UUUU<scePsmfPlayerGetPsmfInfo>, "scePsmfPlayerGetPsmfInfo", 'x', "xxxx" },
|
||||||
{0XE792CD94, &WrapI_U<scePsmfPlayerReleasePsmf>, "scePsmfPlayerReleasePsmf", 'i', "x" },
|
{0XE792CD94, &WrapI_U<scePsmfPlayerReleasePsmf>, "scePsmfPlayerReleasePsmf", 'i', "x" },
|
||||||
{0XF3EFAA91, &WrapU_UUU<scePsmfPlayerGetCurrentPlayMode>, "scePsmfPlayerGetCurrentPlayMode", 'x', "xxx"},
|
{0XF3EFAA91, &WrapU_UUU<scePsmfPlayerGetCurrentPlayMode>, "scePsmfPlayerGetCurrentPlayMode", 'x', "xxx"},
|
||||||
{0XF8EF08A6, &WrapI_U<scePsmfPlayerGetCurrentStatus>, "scePsmfPlayerGetCurrentStatus", 'i', "x" },
|
{0XF8EF08A6, &WrapI_U<scePsmfPlayerGetCurrentStatus>, "scePsmfPlayerGetCurrentStatus", 'i', "x" },
|
||||||
|
|
Loading…
Add table
Reference in a new issue