diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 906a87e8a1..9ab4597765 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -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 diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index 2e42929bfb..ce9b84b667 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -20,10 +20,10 @@ #include #include -#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 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; diff --git a/Core/HLE/sceMpeg.h b/Core/HLE/sceMpeg.h index fd3cf35f48..7cb356b275 100644 --- a/Core/HLE/sceMpeg.h +++ b/Core/HLE/sceMpeg.h @@ -84,4 +84,6 @@ void __MpegInit(); void __MpegDoState(PointerWrap &p); void __MpegShutdown(); +void __MpegLoadModule(int version); + void Register_sceMpeg();