Keep track of the loaded sceMpeg_library version.

They have variations in behavior.
This commit is contained in:
Unknown W. Brackets 2014-03-01 17:18:38 -08:00
parent d2ce324c52
commit cda1bc2772
3 changed files with 35 additions and 14 deletions

View file

@ -46,6 +46,7 @@
#include "Core/HLE/sceKernelModule.h"
#include "Core/HLE/sceKernelThread.h"
#include "Core/HLE/sceKernelMemory.h"
#include "Core/HLE/sceMpeg.h"
#include "Core/HLE/sceIo.h"
#include "Core/HLE/KernelWaitHelpers.h"
#include "Core/ELF/ParamSFO.h"
@ -822,6 +823,10 @@ Module *__KernelLoadELFFromPtr(const u8 *ptr, u32 loadAddress, std::string *erro
char temp[256];
snprintf(temp, sizeof(temp), "Loading module %s with version %%04x", head->modname);
INFO_LOG_REPORT(SCEMODULE,temp, ver);
if (!strcmp(head->modname, "sceMpeg_library")) {
__MpegLoadModule(ver);
}
}
const u8 *in = ptr;
@ -926,6 +931,10 @@ Module *__KernelLoadELFFromPtr(const u8 *ptr, u32 loadAddress, std::string *erro
char temp[256];
snprintf(temp, sizeof(temp), "Loading module %s with version %%04x", modinfo->name);
INFO_LOG_REPORT(SCEMODULE, temp, modinfo->moduleVersion);
if (!strcmp(modinfo->name, "sceMpeg_library")) {
__MpegLoadModule(modinfo->moduleVersion);
}
}
// Check for module blacklist - we don't allow games to load these modules from disc

View file

@ -20,10 +20,10 @@
#include <map>
#include <algorithm>
#include "sceMpeg.h"
#include "sceKernelThread.h"
#include "HLE.h"
#include "../HW/MediaEngine.h"
#include "Core/HLE/sceMpeg.h"
#include "Core/HLE/sceKernelThread.h"
#include "Core/HLE/HLE.h"
#include "Core/HW/MediaEngine.h"
#include "Core/Config.h"
#include "Core/Reporting.h"
#include "GPU/GPUInterface.h"
@ -196,11 +196,10 @@ struct MpegContext {
};
static bool isMpegInit;
static int mpegLibVersion;
static u32 streamIdGen;
static bool isCurrentMpegAnalyzed;
static int actionPostPut;
static std::map<u32, MpegContext *> mpegMap;
static u32 lastMpegHandle = 0;
MpegContext *getMpegCtx(u32 mpegAddr) {
if (!Memory::IsValidAddress(mpegAddr))
@ -322,10 +321,9 @@ private:
};
void __MpegInit() {
lastMpegHandle = 0;
streamIdGen = 1;
isCurrentMpegAnalyzed = false;
isMpegInit = false;
mpegLibVersion = 0x010A;
streamIdGen = 1;
actionPostPut = __KernelRegisterActionType(PostPutAction::Create);
#ifdef USING_FFMPEG
@ -335,13 +333,22 @@ void __MpegInit() {
}
void __MpegDoState(PointerWrap &p) {
auto s = p.Section("sceMpeg", 1);
auto s = p.Section("sceMpeg", 1, 2);
if (!s)
return;
p.Do(lastMpegHandle);
p.Do(streamIdGen);
p.Do(isCurrentMpegAnalyzed);
if (s < 2) {
int oldLastMpeg = -1;
bool oldIsMpegAnaltized = false;
p.Do(oldLastMpeg);
p.Do(streamIdGen);
p.Do(oldIsMpegAnaltized);
// Let's assume the oldest version.
mpegLibVersion = 0x0101;
} else {
p.Do(streamIdGen);
p.Do(mpegLibVersion);
}
p.Do(isMpegInit);
p.Do(actionPostPut);
__KernelRestoreActionType(actionPostPut, PostPutAction::Create);
@ -357,6 +364,10 @@ void __MpegShutdown() {
mpegMap.clear();
}
void __MpegLoadModule(int version) {
mpegLibVersion = version;
}
u32 sceMpegInit() {
if (isMpegInit) {
WARN_LOG(ME, "sceMpegInit(): already initialized");
@ -445,7 +456,6 @@ u32 sceMpegCreate(u32 mpegAddr, u32 dataPtr, u32 size, u32 ringbufferAddr, u32 f
}
MpegContext *ctx = new MpegContext;
mpegMap[mpegHandle] = ctx;
lastMpegHandle = mpegHandle;
// Initialize mpeg values.
ctx->mpegRingbufferAddr = ringbufferAddr;

View file

@ -84,4 +84,6 @@ void __MpegInit();
void __MpegDoState(PointerWrap &p);
void __MpegShutdown();
void __MpegLoadModule(int version);
void Register_sceMpeg();