mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-22 10:04:39 +00:00
137 lines
5.1 KiB
C++
137 lines
5.1 KiB
C++
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#include "videodec.h"
|
|
|
|
#include "common/logging/log.h"
|
|
#include "core/libraries/error_codes.h"
|
|
#include "core/libraries/libs.h"
|
|
#include "videodec_impl.h"
|
|
|
|
namespace Libraries::Videodec {
|
|
|
|
static constexpr u64 kMinimumMemorySize = 32_MB; ///> Fake minimum memory size for querying
|
|
|
|
int PS4_SYSV_ABI sceVideodecCreateDecoder(const OrbisVideodecConfigInfo* pCfgInfoIn,
|
|
const OrbisVideodecResourceInfo* pRsrcInfoIn,
|
|
OrbisVideodecCtrl* pCtrlOut) {
|
|
LOG_INFO(Lib_Videodec, "called");
|
|
|
|
if (!pCfgInfoIn || !pRsrcInfoIn || !pCtrlOut) {
|
|
return ORBIS_VIDEODEC_ERROR_ARGUMENT_POINTER;
|
|
}
|
|
if (pCfgInfoIn->thisSize != sizeof(OrbisVideodecConfigInfo) ||
|
|
pRsrcInfoIn->thisSize != sizeof(OrbisVideodecResourceInfo)) {
|
|
return ORBIS_VIDEODEC_ERROR_STRUCT_SIZE;
|
|
}
|
|
|
|
VdecDecoder* decoder = new VdecDecoder(*pCfgInfoIn, *pRsrcInfoIn);
|
|
pCtrlOut->thisSize = sizeof(OrbisVideodecCtrl);
|
|
pCtrlOut->handle = decoder;
|
|
pCtrlOut->version = 1; //???
|
|
return ORBIS_OK;
|
|
}
|
|
|
|
int PS4_SYSV_ABI sceVideodecDecode(OrbisVideodecCtrl* pCtrlIn,
|
|
const OrbisVideodecInputData* pInputDataIn,
|
|
OrbisVideodecFrameBuffer* pFrameBufferInOut,
|
|
OrbisVideodecPictureInfo* pPictureInfoOut) {
|
|
LOG_TRACE(Lib_Videodec, "called");
|
|
if (!pCtrlIn || !pInputDataIn || !pPictureInfoOut) {
|
|
return ORBIS_VIDEODEC_ERROR_ARGUMENT_POINTER;
|
|
}
|
|
if (pCtrlIn->thisSize != sizeof(OrbisVideodecCtrl) ||
|
|
pFrameBufferInOut->thisSize != sizeof(OrbisVideodecFrameBuffer)) {
|
|
return ORBIS_VIDEODEC_ERROR_STRUCT_SIZE;
|
|
}
|
|
|
|
VdecDecoder* decoder = (VdecDecoder*)pCtrlIn->handle;
|
|
if (!decoder) {
|
|
return ORBIS_VIDEODEC_ERROR_HANDLE;
|
|
}
|
|
return decoder->Decode(*pInputDataIn, *pFrameBufferInOut, *pPictureInfoOut);
|
|
}
|
|
|
|
int PS4_SYSV_ABI sceVideodecDeleteDecoder(OrbisVideodecCtrl* pCtrlIn) {
|
|
LOG_INFO(Lib_Videodec, "(STUBBED) called");
|
|
|
|
VdecDecoder* decoder = (VdecDecoder*)pCtrlIn->handle;
|
|
if (!decoder) {
|
|
return ORBIS_VIDEODEC_ERROR_HANDLE;
|
|
}
|
|
delete decoder;
|
|
return ORBIS_OK;
|
|
}
|
|
|
|
int PS4_SYSV_ABI sceVideodecFlush(OrbisVideodecCtrl* pCtrlIn,
|
|
OrbisVideodecFrameBuffer* pFrameBufferInOut,
|
|
OrbisVideodecPictureInfo* pPictureInfoOut) {
|
|
LOG_INFO(Lib_Videodec, "called");
|
|
|
|
if (!pFrameBufferInOut || !pPictureInfoOut) {
|
|
return ORBIS_VIDEODEC_ERROR_ARGUMENT_POINTER;
|
|
}
|
|
if (pFrameBufferInOut->thisSize != sizeof(OrbisVideodecFrameBuffer) ||
|
|
pPictureInfoOut->thisSize != sizeof(OrbisVideodecPictureInfo)) {
|
|
return ORBIS_VIDEODEC_ERROR_STRUCT_SIZE;
|
|
}
|
|
|
|
VdecDecoder* decoder = (VdecDecoder*)pCtrlIn->handle;
|
|
if (!decoder) {
|
|
return ORBIS_VIDEODEC_ERROR_HANDLE;
|
|
}
|
|
return decoder->Flush(*pFrameBufferInOut, *pPictureInfoOut);
|
|
}
|
|
|
|
int PS4_SYSV_ABI sceVideodecMapMemory() {
|
|
LOG_ERROR(Lib_Videodec, "(STUBBED) called");
|
|
return ORBIS_OK;
|
|
}
|
|
|
|
int PS4_SYSV_ABI sceVideodecQueryResourceInfo(const OrbisVideodecConfigInfo* pCfgInfoIn,
|
|
OrbisVideodecResourceInfo* pRsrcInfoOut) {
|
|
LOG_INFO(Lib_Videodec, "called");
|
|
|
|
if (!pCfgInfoIn || !pRsrcInfoOut) {
|
|
return ORBIS_VIDEODEC_ERROR_ARGUMENT_POINTER;
|
|
}
|
|
if (pCfgInfoIn->thisSize != sizeof(OrbisVideodecConfigInfo) ||
|
|
pRsrcInfoOut->thisSize != sizeof(OrbisVideodecResourceInfo)) {
|
|
return ORBIS_VIDEODEC_ERROR_STRUCT_SIZE;
|
|
}
|
|
|
|
pRsrcInfoOut->thisSize = sizeof(OrbisVideodecResourceInfo);
|
|
pRsrcInfoOut->pCpuMemory = nullptr;
|
|
pRsrcInfoOut->pCpuGpuMemory = nullptr;
|
|
|
|
pRsrcInfoOut->cpuGpuMemorySize = kMinimumMemorySize;
|
|
pRsrcInfoOut->cpuMemorySize = kMinimumMemorySize;
|
|
|
|
pRsrcInfoOut->maxFrameBufferSize = kMinimumMemorySize;
|
|
pRsrcInfoOut->frameBufferAlignment = 0x100;
|
|
|
|
return ORBIS_OK;
|
|
}
|
|
|
|
int PS4_SYSV_ABI sceVideodecReset(OrbisVideodecCtrl* pCtrlIn) {
|
|
LOG_INFO(Lib_Videodec, "(STUBBED) called");
|
|
|
|
VdecDecoder* decoder = (VdecDecoder*)pCtrlIn->handle;
|
|
decoder->Reset();
|
|
return ORBIS_OK;
|
|
}
|
|
|
|
void RegisterlibSceVideodec(Core::Loader::SymbolsResolver* sym) {
|
|
LIB_FUNCTION("qkgRiwHyheU", "libSceVideodec", 1, "libSceVideodec", 1, 1,
|
|
sceVideodecCreateDecoder);
|
|
LIB_FUNCTION("q0W5GJMovMs", "libSceVideodec", 1, "libSceVideodec", 1, 1, sceVideodecDecode);
|
|
LIB_FUNCTION("U0kpGF1cl90", "libSceVideodec", 1, "libSceVideodec", 1, 1,
|
|
sceVideodecDeleteDecoder);
|
|
LIB_FUNCTION("jeigLlKdp5I", "libSceVideodec", 1, "libSceVideodec", 1, 1, sceVideodecFlush);
|
|
LIB_FUNCTION("kg+lH0V61hM", "libSceVideodec", 1, "libSceVideodec", 1, 1, sceVideodecMapMemory);
|
|
LIB_FUNCTION("leCAscipfFY", "libSceVideodec", 1, "libSceVideodec", 1, 1,
|
|
sceVideodecQueryResourceInfo);
|
|
LIB_FUNCTION("f8AgDv-1X8A", "libSceVideodec", 1, "libSceVideodec", 1, 1, sceVideodecReset);
|
|
};
|
|
|
|
} // namespace Libraries::Videodec
|