-
-
Notifications
You must be signed in to change notification settings - Fork 689
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* dummy videocodec * filled videodec parameters * vdec1 implementation * clang format fix * fixed codecType * added crop offset info * align output * align all h/w * some touchups * small touch (last one)
- Loading branch information
1 parent
4fd7f67
commit 7ab8515
Showing
9 changed files
with
539 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,137 @@ | ||
// 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_INFO(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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,108 @@ | ||
// SPDX-FileCopyrightText: Copyright 2024 shadPS4 Emulator Project | ||
// SPDX-License-Identifier: GPL-2.0-or-later | ||
|
||
#pragma once | ||
|
||
#include "common/types.h" | ||
|
||
namespace Core::Loader { | ||
class SymbolsResolver; | ||
} | ||
|
||
namespace Libraries::Videodec { | ||
|
||
struct OrbisVideodecConfigInfo { | ||
u64 thisSize; | ||
u32 codecType; | ||
u32 profile; | ||
u32 maxLevel; | ||
s32 maxFrameWidth; | ||
s32 maxFrameHeight; | ||
s32 maxDpbFrameCount; | ||
u64 videodecFlags; | ||
}; | ||
|
||
struct OrbisVideodecResourceInfo { | ||
u64 thisSize; | ||
u64 cpuMemorySize; | ||
void* pCpuMemory; | ||
u64 cpuGpuMemorySize; | ||
void* pCpuGpuMemory; | ||
u64 maxFrameBufferSize; | ||
u32 frameBufferAlignment; | ||
}; | ||
|
||
struct OrbisVideodecCtrl { | ||
u64 thisSize; | ||
void* handle; | ||
u64 version; | ||
}; | ||
|
||
struct OrbisVideodecFrameBuffer { | ||
u64 thisSize; | ||
void* pFrameBuffer; | ||
u64 frameBufferSize; | ||
}; | ||
|
||
struct OrbisVideodecAvcInfo { | ||
u32 numUnitsInTick; | ||
u32 timeScale; | ||
u8 fixedFrameRateFlag; | ||
u8 aspectRatioIdc; | ||
u16 sarWidth; | ||
u16 sarHeight; | ||
u8 colourPrimaries; | ||
u8 transferCharacteristics; | ||
u8 matrixCoefficients; | ||
u8 videoFullRangeFlag; | ||
u32 frameCropLeftOffset; | ||
u32 frameCropRightOffset; | ||
u32 frameCropTopOffset; | ||
u32 frameCropBottomOffset; | ||
}; | ||
|
||
union OrbisVideodecCodecInfo { | ||
u8 reserved[64]; | ||
OrbisVideodecAvcInfo avc; | ||
}; | ||
|
||
struct OrbisVideodecPictureInfo { | ||
u64 thisSize; | ||
u32 isValid; | ||
u32 codecType; | ||
u32 frameWidth; | ||
u32 framePitch; | ||
u32 frameHeight; | ||
u32 isErrorPic; | ||
u64 ptsData; | ||
u64 attachedData; | ||
OrbisVideodecCodecInfo codec; | ||
}; | ||
|
||
struct OrbisVideodecInputData { | ||
u64 thisSize; | ||
void* pAuData; | ||
u64 auSize; | ||
u64 ptsData; | ||
u64 dtsData; | ||
u64 attachedData; | ||
}; | ||
|
||
int PS4_SYSV_ABI sceVideodecCreateDecoder(const OrbisVideodecConfigInfo* pCfgInfoIn, | ||
const OrbisVideodecResourceInfo* pRsrcInfoIn, | ||
OrbisVideodecCtrl* pCtrlOut); | ||
int PS4_SYSV_ABI sceVideodecDecode(OrbisVideodecCtrl* pCtrlIn, | ||
const OrbisVideodecInputData* pInputDataIn, | ||
OrbisVideodecFrameBuffer* pFrameBufferInOut, | ||
OrbisVideodecPictureInfo* pPictureInfoOut); | ||
int PS4_SYSV_ABI sceVideodecDeleteDecoder(OrbisVideodecCtrl* pCtrlIn); | ||
int PS4_SYSV_ABI sceVideodecFlush(OrbisVideodecCtrl* pCtrlIn, | ||
OrbisVideodecFrameBuffer* pFrameBufferInOut, | ||
OrbisVideodecPictureInfo* pPictureInfoOut); | ||
int PS4_SYSV_ABI sceVideodecMapMemory(); | ||
int PS4_SYSV_ABI sceVideodecQueryResourceInfo(const OrbisVideodecConfigInfo* pCfgInfoIn, | ||
OrbisVideodecResourceInfo* pRsrcInfoOut); | ||
int PS4_SYSV_ABI sceVideodecReset(OrbisVideodecCtrl* pCtrlIn); | ||
|
||
void RegisterlibSceVideodec(Core::Loader::SymbolsResolver* sym); | ||
} // namespace Libraries::Videodec |
Oops, something went wrong.