1
0
mirror of https://github.com/RPCS3/rpcs3.git synced 2024-11-21 18:22:33 +01:00

cellAdec: add internal datatypes

This commit is contained in:
capriots 2024-02-16 22:21:11 +01:00 committed by Megamouse
parent 7df33bc8c0
commit 5ce9c5b09f
2 changed files with 162 additions and 30 deletions

View File

@ -910,7 +910,7 @@ error_code cellAdecDecodeAu(u32 handle, vm::ptr<CellAdecAuInfo> auInfo)
AdecTask task(adecDecodeAu);
task.au.auInfo_addr = auInfo.addr();
task.au.addr = auInfo->startAddr;
task.au.addr = auInfo->startAddr.addr();
task.au.size = auInfo->size;
task.au.pts = (u64{auInfo->pts.upper} << 32) | u64{auInfo->pts.lower};
task.au.userdata = auInfo->userData;
@ -1072,7 +1072,7 @@ error_code cellAdecGetPcmItem(u32 handle, vm::pptr<CellAdecPcmItem> pcmItem)
pcm->auInfo.pts.lower = static_cast<u32>(af.pts);
pcm->auInfo.pts.upper = static_cast<u32>(af.pts >> 32);
pcm->auInfo.size = af.auSize;
pcm->auInfo.startAddr = af.auAddr;
pcm->auInfo.startAddr.set(af.auAddr);
pcm->auInfo.userData = af.userdata;
if (adecIsAtracX(adec->type))

View File

@ -250,38 +250,38 @@ enum CellAdecError : u32
// Audio Codec Type
enum AudioCodecType : s32
{
CELL_ADEC_TYPE_RESERVED1,
CELL_ADEC_TYPE_INVALID1,
CELL_ADEC_TYPE_LPCM_PAMF,
CELL_ADEC_TYPE_AC3,
CELL_ADEC_TYPE_ATRACX,
CELL_ADEC_TYPE_MP3,
CELL_ADEC_TYPE_ATRAC3,
CELL_ADEC_TYPE_MPEG_L2,
CELL_ADEC_TYPE_RESERVED5,
CELL_ADEC_TYPE_RESERVED6,
CELL_ADEC_TYPE_RESERVED7,
CELL_ADEC_TYPE_RESERVED8,
CELL_ADEC_TYPE_M2AAC,
CELL_ADEC_TYPE_EAC3,
CELL_ADEC_TYPE_TRUEHD,
CELL_ADEC_TYPE_DTS, // Removed in firmware 4.00, integrated into DTSHD
CELL_ADEC_TYPE_CELP,
CELL_ADEC_TYPE_RESERVED10,
CELL_ADEC_TYPE_LPCM_BLURAY,
CELL_ADEC_TYPE_ATRACX_2CH,
CELL_ADEC_TYPE_ATRACX_6CH,
CELL_ADEC_TYPE_ATRACX_8CH,
CELL_ADEC_TYPE_M4AAC,
CELL_ADEC_TYPE_RESERVED12,
CELL_ADEC_TYPE_RESERVED13,
CELL_ADEC_TYPE_RESERVED14,
CELL_ADEC_TYPE_RESERVED15,
CELL_ADEC_TYPE_RESERVED16,
CELL_ADEC_TYPE_RESERVED17,
CELL_ADEC_TYPE_RESERVED18,
CELL_ADEC_TYPE_RESERVED19,
CELL_ADEC_TYPE_LPCM_DVD,
CELL_ADEC_TYPE_WMA,
CELL_ADEC_TYPE_DTSLBR,
CELL_ADEC_TYPE_M4AAC_2CH,
CELL_ADEC_TYPE_DTSHD,
CELL_ADEC_TYPE_MPEG_L1,
CELL_ADEC_TYPE_MP3S,
CELL_ADEC_TYPE_M4AAC_2CH_MOD,
CELL_ADEC_TYPE_CELP8,
CELL_ADEC_TYPE_RESERVED20,
CELL_ADEC_TYPE_RESERVED21,
CELL_ADEC_TYPE_RESERVED22,
CELL_ADEC_TYPE_RESERVED23,
CELL_ADEC_TYPE_RESERVED24,
CELL_ADEC_TYPE_RESERVED25,
CELL_ADEC_TYPE_INVALID2,
CELL_ADEC_TYPE_INVALID3,
CELL_ADEC_TYPE_RESERVED22, // Either WMA Pro or WMA Lossless, was never released
CELL_ADEC_TYPE_RESERVED23, // Either WMA Pro or WMA Lossless, was never released
CELL_ADEC_TYPE_DTSHDCORE, // Removed in firmware 4.00, integrated into DTSHD
CELL_ADEC_TYPE_ATRAC3MULTI,
};
inline bool adecIsAtracX(s32 type)
@ -313,10 +313,12 @@ enum CellAdecChannel : s32
// Sampling Rate
enum CellAdecSampleRate : s32
{
CELL_ADEC_FS_RESERVED1 = 0,
CELL_ADEC_FS_48kHz = 1,
CELL_ADEC_FS_16kHz = 2,
CELL_ADEC_FS_8kHz = 5,
CELL_ADEC_FS_RESERVED1,
CELL_ADEC_FS_48kHz,
CELL_ADEC_FS_16kHz,
CELL_ADEC_FS_96kHz,
CELL_ADEC_FS_192kHz,
CELL_ADEC_FS_8kHz,
};
enum CellAdecBitLength : s32
@ -359,6 +361,13 @@ struct CellAdecResourceEx
be_t<u32> maxContention;
};
struct CellAdecResourceSpurs
{
be_t<u32> spurs_addr; // CellSpurs*
u8 priority[8];
be_t<u32> maxContention;
};
// Callback Messages
enum CellAdecMsgType : s32
{
@ -370,16 +379,20 @@ enum CellAdecMsgType : s32
using CellAdecCbMsg = s32(u32 handle, CellAdecMsgType msgType, s32 msgData, u32 cbArg);
struct CellAdecCb
// Used for internal callbacks as well
template <typename F>
struct AdecCb
{
vm::bptr<CellAdecCbMsg> cbFunc;
be_t<u32> cbArg;
vm::bptr<F> cbFunc;
vm::bptr<void> cbArg;
};
typedef AdecCb<CellAdecCbMsg> CellAdecCb;
// AU Info
struct CellAdecAuInfo
{
be_t<u32> startAddr;
vm::bcptr<u8> startAddr;
be_t<u32> size;
CellCodecTimeStamp pts;
be_t<u64> userData;
@ -401,6 +414,125 @@ struct CellAdecPcmItem
CellAdecAuInfo auInfo;
};
// Controls how much is added to the presentation time stamp of the previous frame if the game didn't set a pts itself in CellAdecAuInfo when calling cellAdecDecodeAu()
enum AdecCorrectPtsValueType : s8
{
ADEC_CORRECT_PTS_VALUE_TYPE_UNSPECIFIED = -1,
// Adds a fixed amount
ADEC_CORRECT_PTS_VALUE_TYPE_LPCM = 0,
// 1
ADEC_CORRECT_PTS_VALUE_TYPE_ATRACX_48000Hz = 2,
ADEC_CORRECT_PTS_VALUE_TYPE_ATRACX_44100Hz = 3,
ADEC_CORRECT_PTS_VALUE_TYPE_ATRACX_32000Hz = 4,
// 5: Dolby Digital
// 6: ATRAC3
// 7: MP3
// 8: MP3
// 9: MP3
// 39: ATRAC3 multi-track
// Calls a decoder function (_SceAdecCorrectPtsValue_codec())
// 17: Dolby Digital Plus
// 18
// 19
// 20
// 21: DTS HD
// 22
// 23
// 24: CELP
// 25: MPEG-2 AAC
// 26: MPEG-2 BC
// 27: Dolby TrueHD
// 28: DTS
// 29: MPEG-4 AAC
// 30: Windows Media Audio
// 31: DTS Express
// 32: MP1
// 33: MP3 Surround
// 34: CELP8
// 35: Windows Media Audio Professional
// 36: Windows Media Audio Lossless
// 37: DTS HD Core
// 38: DTS HD Core
};
// Internal callbacks
using AdecNotifyAuDone = error_code(s32 pcmHandle, vm::ptr<void> cbArg);
using AdecNotifyPcmOut = error_code(s32 pcmHandle, vm::ptr<void> pcmAddr, u32 pcmSize, vm::ptr<void> cbArg, vm::cpptr<void> bsiInfo, AdecCorrectPtsValueType correctPtsValueType, s32 errorCode);
using AdecNotifyError = error_code(s32 errorCode, vm::ptr<void> cbArg);
using AdecNotifySeqDone = error_code(vm::ptr<void> cbArg);
// Decoder functions
using CellAdecCoreOpGetMemSize = error_code(vm::ptr<CellAdecAttr> attr);
using CellAdecCoreOpOpen = error_code(vm::ptr<void> coreHandle, vm::ptr<AdecNotifyAuDone> cbFuncAuDone, vm::ptr<void> cbArgAuDone, vm::ptr<AdecNotifyPcmOut> cbFuncPcmOut, vm::ptr<void> cbArgPcmOut,
vm::ptr<AdecNotifyError> cbFuncError, vm::ptr<void> cbArgError, vm::ptr<AdecNotifySeqDone> cbFuncSeqDone, vm::ptr<void> cbArgSeqDone, vm::cptr<CellAdecResource> res);
using CellAdecCoreOpClose = error_code(vm::ptr<void> coreHandle);
using CellAdecCoreOpStartSeq = error_code(vm::ptr<void> coreHandle, vm::cptr<void> param);
using CellAdecCoreOpEndSeq = error_code(vm::ptr<void> coreHandle);
using CellAdecCoreOpDecodeAu = error_code(vm::ptr<void> coreHandle, s32 pcmHandle, vm::cptr<CellAdecAuInfo> auInfo);
using CellAdecCoreOpGetVersion = void(vm::ptr<std::array<u8, 4>> version);
using CellAdecCoreOpRealign = error_code(vm::ptr<void> coreHandle, vm::ptr<void> outBuffer, vm::cptr<void> pcmStartAddr);
using CellAdecCoreOpReleasePcm = error_code(vm::ptr<void> coreHandle, s32 pcmHandle, vm::cptr<void> outBuffer);
using CellAdecCoreOpGetPcmHandleNum = s32();
using CellAdecCoreOpGetBsiInfoSize = u32();
using CellAdecCoreOpOpenExt = error_code(vm::ptr<void> coreHandle, vm::ptr<AdecNotifyAuDone> cbFuncAuDone, vm::ptr<void> cbArgAuDone, vm::ptr<AdecNotifyPcmOut> cbFuncPcmOut, vm::ptr<void> cbArgPcmOut,
vm::ptr<AdecNotifyError> cbFuncError, vm::ptr<void> cbArgError, vm::ptr<AdecNotifySeqDone> cbFuncSeqDone, vm::ptr<void> cbArgSeqDone, vm::cptr<CellAdecResource> res, vm::cptr<CellAdecResourceSpurs> spursRes);
// Decoders export a pointer to this struct
struct CellAdecCoreOps
{
vm::bptr<CellAdecCoreOpGetMemSize> getMemSize;
vm::bptr<CellAdecCoreOpOpen> open;
vm::bptr<CellAdecCoreOpClose> close;
vm::bptr<CellAdecCoreOpStartSeq> startSeq;
vm::bptr<CellAdecCoreOpEndSeq> endSeq;
vm::bptr<CellAdecCoreOpDecodeAu> decodeAu;
vm::bptr<CellAdecCoreOpGetVersion> getVersion;
vm::bptr<CellAdecCoreOpRealign> realign;
vm::bptr<CellAdecCoreOpReleasePcm> releasePcm;
vm::bptr<CellAdecCoreOpGetPcmHandleNum> getPcmHandleNum;
vm::bptr<CellAdecCoreOpGetBsiInfoSize> getBsiInfoSize;
vm::bptr<CellAdecCoreOpOpenExt> openExt;
};
// Used by several decoders as command queue
template <typename T>
struct AdecCmdQueue
{
T elements[4];
be_t<s32> front = 0;
be_t<s32> back = 0;
be_t<s32> size = 0;
template <bool is_peek = false>
void pop(T& cmd)
{
// LLE returns uninitialized stack memory if the queue is empty
cmd = elements[front];
if constexpr (!is_peek)
{
elements[front].pcm_handle = 0xff;
front = (front + 1) & 3;
size--;
}
}
void emplace(auto&&... args)
{
new (&elements[back]) T(std::forward<decltype(args)>(args)...);
back = (back + 1) & 3;
size++;
}
void peek(T& cmd) const { return pop<true>(cmd); }
bool empty() const { return size == 0; }
bool full() const { return size >= 4; }
};
struct CellAdecParamLpcm
{
be_t<u32> channelNumber;