From d65647acf373c05e663b511b1ce74bc7cfd23960 Mon Sep 17 00:00:00 2001 From: Nekotekina Date: Sun, 19 Jan 2014 14:52:30 +0400 Subject: [PATCH] cellPamf update, cellDmux draft --- rpcs3/Emu/Cell/PPUInterpreter.h | 2 + rpcs3/Emu/SysCalls/Modules/cellDmux.cpp | 111 ++++---- rpcs3/Emu/SysCalls/Modules/cellDmux.h | 143 ++++++++++ rpcs3/Emu/SysCalls/Modules/cellPamf.cpp | 276 ++----------------- rpcs3/Emu/SysCalls/Modules/cellPamf.h | 335 ++++++++++++++++++++++++ rpcs3/Emu/SysCalls/Modules/sys_fs.cpp | 15 +- rpcs3/rpcs3.vcxproj | 1 + rpcs3/rpcs3.vcxproj.filters | 3 + 8 files changed, 577 insertions(+), 309 deletions(-) create mode 100644 rpcs3/Emu/SysCalls/Modules/cellDmux.h create mode 100644 rpcs3/Emu/SysCalls/Modules/cellPamf.h diff --git a/rpcs3/Emu/Cell/PPUInterpreter.h b/rpcs3/Emu/Cell/PPUInterpreter.h index c4fda8f33a..4e447d9d34 100644 --- a/rpcs3/Emu/Cell/PPUInterpreter.h +++ b/rpcs3/Emu/Cell/PPUInterpreter.h @@ -2109,6 +2109,7 @@ private: } void ISYNC() { + _mm_mfence(); } void CRXOR(u32 crbd, u32 crba, u32 crbb) { @@ -2979,6 +2980,7 @@ private: } void SYNC(u32 l) { + _mm_mfence(); } void LFDX(u32 frd, u32 ra, u32 rb) { diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp index fa523aa9f2..1326c33770 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.cpp @@ -1,137 +1,148 @@ #include "stdafx.h" #include "Emu/SysCalls/SysCalls.h" #include "Emu/SysCalls/SC_FUNC.h" +#include "cellPamf.h" +#include "cellDmux.h" void cellDmux_init(); Module cellDmux(0x0007, cellDmux_init); -// Error Codes -enum +int cellDmuxQueryAttr(mem_ptr_t demuxerType, mem_ptr_t demuxerAttr) { - CELL_DMUX_ERROR_ARG = 0x80610201, - CELL_DMUX_ERROR_SEQ = 0x80610202, - CELL_DMUX_ERROR_BUSY = 0x80610203, - CELL_DMUX_ERROR_EMPTY = 0x80610204, - CELL_DMUX_ERROR_FATAL = 0x80610205, -}; - -int cellDmuxQueryAttr() -{ - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxQueryAttr(demuxerType_addr=0x%x, demuxerAttr_addr=0x%x)", demuxerType.GetAddr(), demuxerAttr.GetAddr()); return CELL_OK; } -int cellDmuxQueryAttr2() +int cellDmuxQueryAttr2(mem_ptr_t demuxerType2, mem_ptr_t demuxerAttr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxQueryAttr2(demuxerType2_addr=0x%x, demuxerAttr_addr=0x%x)", demuxerType2.GetAddr(), demuxerAttr.GetAddr()); return CELL_OK; } -int cellDmuxOpen() +int cellDmuxOpen(mem_ptr_t demuxerType, mem_ptr_t demuxerResource, + mem_ptr_t demuxerCb, u32 demuxerHandle_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxOpen(demuxerType_addr=0x%x, demuxerResource_addr=0x%x, demuxerCb_addr=0x%x, demuxerHandle_addr=0x%x)", + demuxerType.GetAddr(), demuxerResource.GetAddr(), demuxerCb.GetAddr(), demuxerHandle_addr); return CELL_OK; } -int cellDmuxOpenEx() +int cellDmuxOpenEx(mem_ptr_t demuxerType, mem_ptr_t demuxerResourceEx, + mem_ptr_t demuxerCb, u32 demuxerHandle_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxOpenEx(demuxerType_addr=0x%x, demuxerResourceEx_addr=0x%x, demuxerCb_addr=0x%x, demuxerHandle_addr=0x%x)", + demuxerType.GetAddr(), demuxerResourceEx.GetAddr(), demuxerCb.GetAddr(), demuxerHandle_addr); return CELL_OK; } -int cellDmuxOpen2() +int cellDmuxOpen2(mem_ptr_t demuxerType2, u32 demuxerResource2_addr, + mem_ptr_t demuxerCb, u32 demuxerHandle_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxOpen2(demuxerType2_addr=0x%x, demuxerResource2_addr=0x%x, demuxerCb_addr=0x%x, demuxerHandle_addr=0x%x)", + demuxerType2.GetAddr(), demuxerResource2_addr, demuxerCb.GetAddr(), demuxerHandle_addr); return CELL_OK; } -int cellDmuxClose() +int cellDmuxClose(u32 demuxerHandle_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxClose(demuxerHandle_addr=0x%x)", demuxerHandle_addr); return CELL_OK; } -int cellDmuxSetStream() +int cellDmuxSetStream(u32 demuxerHandle_addr, u32 streamAddress, u32 streamSize, bool discontinuity, u64 userData) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxSetStream(demuxerHandle_addr=0x%x, streamAddress=0x%x, streamSize=%d, discontinuity=%d, userData=0x%llx", + demuxerHandle_addr, streamAddress, streamSize, discontinuity, userData); return CELL_OK; } -int cellDmuxResetStream() +int cellDmuxResetStream(u32 demuxerHandle_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxResetStream(demuxerHandle_addr=0x%x)", demuxerHandle_addr); return CELL_OK; } -int cellDmuxResetStreamAndWaitDone() +int cellDmuxResetStreamAndWaitDone(u32 demuxerHandle_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxResetStreamAndWaitDone(demuxerHandle_addr=0x%x)", demuxerHandle_addr); return CELL_OK; } -int cellDmuxQueryEsAttr() +int cellDmuxQueryEsAttr(mem_ptr_t demuxerType, mem_ptr_t esFilterId, + u32 esSpecificInfo_addr, mem_ptr_t esAttr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxQueryEsAttr(demuxerType_addr=0x%x, esFilterId_addr=0x%x, esSpecificInfo_addr=0x%x, esAttr_addr=0x%x)", + demuxerType.GetAddr(), esFilterId.GetAddr(), esSpecificInfo_addr, esAttr.GetAddr()); return CELL_OK; } -int cellDmuxQueryEsAttr2() +int cellDmuxQueryEsAttr2(mem_ptr_t demuxerType2, mem_ptr_t esFilterId, + u32 esSpecificInfo_addr, mem_ptr_t esAttr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxQueryEsAttr2(demuxerType2_addr=0x%x, esFilterId_addr=0x%x, esSpecificInfo_addr=0x%x, esAttr_addr=0x%x)", + demuxerType2.GetAddr(), esFilterId.GetAddr(), esSpecificInfo_addr, esAttr.GetAddr()); return CELL_OK; } -int cellDmuxEnableEs() +int cellDmuxEnableEs(u32 demuxerHandle_addr, mem_ptr_t esFilterId, + mem_ptr_t esResourceInfo, mem_ptr_t esCb, + u32 esSpecificInfo_addr, u32 esHandle_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxEnableEs(demuxerHandle_addr=0x%x, esFilterId_addr=0x%x, esResourceInfo_addr=0x%x, esCb_addr=0x%x, " + "esSpecificInfo_addr=0x%x, esHandle_addr=0x%x)", demuxerHandle_addr, esFilterId.GetAddr(), esResourceInfo.GetAddr(), + esCb.GetAddr(), esSpecificInfo_addr, esHandle_addr); return CELL_OK; } -int cellDmuxDisableEs() +int cellDmuxDisableEs(u32 esHandle_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxDisableEs(esHandle_addr=0x%x)", esHandle_addr); return CELL_OK; } -int cellDmuxResetEs() +int cellDmuxResetEs(u32 esHandle_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxResetEs(esHandle_addr=0x%x)", esHandle_addr); return CELL_OK; } -int cellDmuxGetAu() +int cellDmuxGetAu(u32 esHandle_addr, u32 auInfo_ptr_addr, u32 auSpecificInfo_ptr_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxGetAu(esHandle_addr=0x%x, auInfo_ptr_addr=0x%x, auSpecificInfo_ptr_addr=0x%x)", + esHandle_addr, auInfo_ptr_addr, auSpecificInfo_ptr_addr); return CELL_OK; } -int cellDmuxPeekAu() +int cellDmuxPeekAu(u32 esHandle_addr, u32 auInfo_ptr_addr, u32 auSpecificInfo_ptr_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxPeekAu(esHandle_addr=0x%x, auInfo_ptr_addr=0x%x, auSpecificInfo_ptr_addr=0x%x)", + esHandle_addr, auInfo_ptr_addr, auSpecificInfo_ptr_addr); return CELL_OK; } -int cellDmuxGetAuEx() +int cellDmuxGetAuEx(u32 esHandle_addr, u32 auInfoEx_ptr_addr, u32 auSpecificInfo_ptr_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxGetAuEx(esHandle_addr=0x%x, auInfoEx_ptr_addr=0x%x, auSpecificInfo_ptr_addr=0x%x)", + esHandle_addr, auInfoEx_ptr_addr, auSpecificInfo_ptr_addr); return CELL_OK; } -int cellDmuxPeekAuEx() +int cellDmuxPeekAuEx(u32 esHandle_addr, u32 auInfoEx_ptr_addr, u32 auSpecificInfo_ptr_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxPeekAuEx(esHandle_addr=0x%x, auInfoEx_ptr_addr=0x%x, auSpecificInfo_ptr_addr=0x%x)", + esHandle_addr, auInfoEx_ptr_addr, auSpecificInfo_ptr_addr); return CELL_OK; } -int cellDmuxReleaseAu() +int cellDmuxReleaseAu(u32 esHandle_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxReleaseAu(esHandle_addr=0x%x)", esHandle_addr); return CELL_OK; } -int cellDmuxFlushEs() +int cellDmuxFlushEs(u32 esHandle_addr) { - UNIMPLEMENTED_FUNC(cellDmux); + cellDmux.Error("cellDmuxFlushEs(esHandle_addr=0x%x)", esHandle_addr); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellDmux.h b/rpcs3/Emu/SysCalls/Modules/cellDmux.h new file mode 100644 index 0000000000..a42bfbdcc2 --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/cellDmux.h @@ -0,0 +1,143 @@ +#pragma once + +// Error Codes +enum +{ + CELL_DMUX_ERROR_ARG = 0x80610201, + CELL_DMUX_ERROR_SEQ = 0x80610202, + CELL_DMUX_ERROR_BUSY = 0x80610203, + CELL_DMUX_ERROR_EMPTY = 0x80610204, + CELL_DMUX_ERROR_FATAL = 0x80610205, +}; + +enum CellDmuxStreamType +{ + CELL_DMUX_STREAM_TYPE_UNDEF = 0, + CELL_DMUX_STREAM_TYPE_PAMF = 1, + CELL_DMUX_STREAM_TYPE_TERMINATOR = 2, +}; + +enum CellDmuxMsgType +{ + CELL_DMUX_MSG_TYPE_DEMUX_DONE = 0, + CELL_DMUX_MSG_TYPE_FATAL_ERR = 1, + CELL_DMUX_MSG_TYPE_PROG_END_CODE = 2, +}; + +enum CellDmuxEsMsgType +{ + CELL_DMUX_ES_MSG_TYPE_AU_FOUND = 0, + CELL_DMUX_ES_MSG_TYPE_FLUSH_DONE = 1, +}; + +struct CellDmuxMsg +{ + be_t msgType; //CellDmuxMsgType enum + be_t supplementalInfo; +}; + +struct CellDmuxEsMsg +{ + be_t msgType; //CellDmuxEsMsgType enum + be_t supplementalInfo; +}; + +struct CellDmuxType +{ + CellDmuxStreamType streamType; + be_t reserved[2]; //0 +}; + +struct CellDmuxType2 +{ + CellDmuxStreamType streamType; + be_t streamSpecificInfo_addr; +}; + +struct CellDmuxResource +{ + be_t memAddr; + be_t memSize; + be_t ppuThreadPriority; + be_t ppuThreadStackSize; + be_t spuThreadPriority; + be_t numOfSpus; +}; + +struct CellDmuxResourceEx +{ + be_t memAddr; + be_t memSize; + be_t ppuThreadPriority; + be_t ppuThreadStackSize; + be_t spurs_addr; + u8 priority[8]; + be_t maxContention; +}; + +struct CellDmuxResource2Ex +{ + bool isResourceEx; //true + CellDmuxResourceEx resourceEx; +}; + +struct CellDmuxResource2NoEx +{ + bool isResourceEx; //false + CellDmuxResource resource; +}; + +struct CellDmuxCb +{ + // CellDmuxCbMsg callback + mem_func_ptr_t demuxerMsg, u32 cbArg_addr)> cbMsgFunc; + be_t cbArg_addr; +}; + +struct CellDmuxEsCb +{ + // CellDmuxCbEsMsg callback + mem_func_ptr_t esMsg, u32 cbArg_addr)> cbEsMsgFunc; + be_t cbArg_addr; +}; + +struct CellDmuxAttr +{ + be_t memSize; + be_t demuxerVerUpper; + be_t demuxerVerLower; +}; + +struct CellDmuxEsAttr +{ + be_t memSize; +}; + +struct CellDmuxEsResource +{ + be_t memAddr; + be_t memSize; +}; + +struct CellDmuxAuInfo +{ + be_t auAddr; + be_t auSize; + be_t auMaxSize; + be_t userData; + be_t ptsUpper; + be_t ptsLower; + be_t dtsUpper; + be_t dtsLower; +}; + +struct CellDmuxAuInfoEx +{ + be_t auAddr; + be_t auSize; + be_t reserved; + bool isRap; + be_t userData; + CellCodecTimeStamp pts; + CellCodecTimeStamp dts; +}; \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/Modules/cellPamf.cpp b/rpcs3/Emu/SysCalls/Modules/cellPamf.cpp index 4deaac2801..b602352289 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellPamf.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellPamf.cpp @@ -1,257 +1,11 @@ #include "stdafx.h" #include "Emu/SysCalls/SysCalls.h" #include "Emu/SysCalls/SC_FUNC.h" +#include "cellPamf.h" void cellPamf_init(); Module cellPamf(0x0012, cellPamf_init); -// Error Codes -enum -{ - CELL_PAMF_ERROR_STREAM_NOT_FOUND = 0x80610501, - CELL_PAMF_ERROR_INVALID_PAMF = 0x80610502, - CELL_PAMF_ERROR_INVALID_ARG = 0x80610503, - CELL_PAMF_ERROR_UNKNOWN_TYPE = 0x80610504, - CELL_PAMF_ERROR_UNSUPPORTED_VERSION = 0x80610505, - CELL_PAMF_ERROR_UNKNOWN_STREAM = 0x80610506, - CELL_PAMF_ERROR_EP_NOT_FOUND = 0x80610507, -}; - -// PamfReaderInitialize Attribute Flags -enum -{ - CELL_PAMF_ATTRIBUTE_VERIFY_ON = 1, - CELL_PAMF_ATTRIBUTE_MINIMUM_HEADER = 2, -}; - -typedef enum { - CELL_PAMF_STREAM_TYPE_AVC = 0, - CELL_PAMF_STREAM_TYPE_M2V = 1, - CELL_PAMF_STREAM_TYPE_ATRAC3PLUS = 2, - CELL_PAMF_STREAM_TYPE_PAMF_LPCM = 3, - CELL_PAMF_STREAM_TYPE_AC3 = 4, - CELL_PAMF_STREAM_TYPE_USER_DATA = 5, - CELL_PAMF_STREAM_TYPE_VIDEO = 20, - CELL_PAMF_STREAM_TYPE_AUDIO = 21, -} CellPamfStreamType; - -typedef enum { - CELL_PAMF_FS_48kHz = 1, -}; - -typedef enum { - CELL_PAMF_BIT_LENGTH_16 = 1, - CELL_PAMF_BIT_LENGTH_24 = 3, -}; - -typedef enum { - CELL_PAMF_AVC_FRC_24000DIV1001 = 0, - CELL_PAMF_AVC_FRC_24 = 1, - CELL_PAMF_AVC_FRC_25 = 2, - CELL_PAMF_AVC_FRC_30000DIV1001 = 3, - CELL_PAMF_AVC_FRC_30 = 4, - CELL_PAMF_AVC_FRC_50 = 5, - CELL_PAMF_AVC_FRC_60000DIV1001 = 6, -}; - -// Timestamp information (time in increments of 90 kHz) -struct CellCodecTimeStamp { - be_t upper; - be_t lower; -}; - -// Entry point information -struct CellPamfEp { - be_t indexN; - be_t nThRefPictureOffset; - CellCodecTimeStamp pts; - be_t rpnOffset; -}; - -// Entry point iterator -struct CellPamfEpIterator { - be_t isPamf; - be_t index; - be_t num; - be_t pCur_addr; -}; - -struct CellCodecEsFilterId { - be_t filterIdMajor; - be_t filterIdMinor; - be_t supplementalInfo1; - be_t supplementalInfo2; -}; - -// AVC (MPEG4 AVC Video) Specific Information -struct CellPamfAvcInfo { - u8 profileIdc; - u8 levelIdc; - u8 frameMbsOnlyFlag; - u8 videoSignalInfoFlag; - u8 frameRateInfo; - u8 aspectRatioIdc; - be_t sarWidth; //reserved - be_t sarHeight; //reserved - be_t horizontalSize; - be_t verticalSize; - be_t frameCropLeftOffset; //reserved - be_t frameCropRightOffset; //reserved - be_t frameCropTopOffset; //reserved - be_t frameCropBottomOffset; //!!!!! - u8 videoFormat; //reserved - u8 videoFullRangeFlag; - u8 colourPrimaries; - u8 transferCharacteristics; - u8 matrixCoefficients; - u8 entropyCodingModeFlag; //reserved - u8 deblockingFilterFlag; - u8 minNumSlicePerPictureIdc; //reserved - u8 nfwIdc; //reserved - u8 maxMeanBitrate; //reserved -}; - -// M2V (MPEG2 Video) Specific Information -struct CellPamfM2vInfo { - u8 profileAndLevelIndication; - be_t progressiveSequence; - u8 videoSignalInfoFlag; - u8 frameRateInfo; - u8 aspectRatioIdc; - be_t sarWidth; - be_t sarHeight; - be_t horizontalSize; - be_t verticalSize; - be_t horizontalSizeValue; - be_t verticalSizeValue; - u8 videoFormat; - u8 videoFullRangeFlag; - u8 colourPrimaries; - u8 transferCharacteristics; - u8 matrixCoefficients; -}; - -// LPCM Audio Specific Information -struct CellPamfLpcmInfo { - be_t samplingFrequency; - u8 numberOfChannels; - be_t bitsPerSample; -}; - -// ATRAC3+ Audio Specific Information -struct CellPamfAtrac3plusInfo { - be_t samplingFrequency; - u8 numberOfChannels; -}; - -// AC3 Audio Specific Information -struct CellPamfAc3Info { - be_t samplingFrequency; - u8 numberOfChannels; -}; - -#pragma pack(push, 1) //file data - -struct PamfStreamHeader_AVC { //AVC specific information - u8 profileIdc; - u8 levelIdc; - u8 unk0; - u8 unk1; //1 - u32 unk2; //0 - be_t horizontalSize; //divided by 16 - be_t verticalSize; //divided by 16 - u32 unk3; //0 - u32 unk4; //0 - u8 unk5; //0xA0 - u8 unk6; //1 - u8 unk7; //1 - u8 unk8; //1 - u8 unk9; //0xB0 - u8 unk10; - u16 unk11; //0 - u32 unk12; //0 -}; - -struct PamfStreamHeader_M2V { //M2V specific information - u8 unknown[32]; //no information yet -}; - -struct PamfStreamHeader_Audio { //Audio specific information - u16 unknown; //== 0 - u8 channels; //number of channels (1, 2, 6 or 8) - u8 freq; //== 1 (always 48000) - u8 bps; //(LPCM only, 0x40 for 16 bit, ???? for 24) - u8 reserved[27]; //probably nothing -}; - -struct PamfStreamHeader //48 bytes -{ - //TODO: look for correct beginning of stream header - u8 type; //0x1B for video (AVC), 0xDC ATRAC3+, 0x80 LPCM, 0xDD userdata - u8 unknown[3]; //0 - //TODO: examine stream_ch encoding - u8 stream_id; - u8 private_stream_id; - u8 unknown1; //????? - u8 unknown2; //????? - //Entry Point Info - be_t ep_offset; //offset of EP section in header - be_t ep_num; //count of EPs - //Specific Info - u8 data[32]; -}; - -struct PamfHeader -{ - u32 magic; //"PAMF" - u32 version; //"0041" (is it const?) - be_t data_offset; //== 2048 >> 11, PAMF headers seem to be always 2048 bytes in size - be_t data_size; //== ((fileSize - 2048) >> 11) - u64 reserved[8]; - be_t table_size; //== size of mapping-table - u16 reserved1; - be_t start_pts_high; - be_t start_pts_low; //Presentation Time Stamp (start) - be_t end_pts_high; - be_t end_pts_low; //Presentation Time Stamp (end) - be_t mux_rate_max; //== 0x01D470 (400 bps per unit, == 48000000 bps) - be_t mux_rate_min; //== 0x0107AC (?????) - u16 reserved2; // ????? - u8 reserved3; - u8 stream_count; //total stream count (reduced to 1 byte) - be_t unk1; //== 1 (?????) - be_t table_data_size; //== table_size - 0x20 == 0x14 + (0x30 * total_stream_num) (?????) - //TODO: check relative offset of stream structs (could be from 0x0c to 0x14, currently 0x14) - be_t start_pts_high2; //????? (probably same values) - be_t start_pts_low2; //????? - be_t end_pts_high2; //????? - be_t end_pts_low2; //????? - be_t unk2; //== 0x10000 (?????) - be_t unk3; // ????? - be_t unk4; // == stream_count - //========================== - PamfStreamHeader stream_headers[256]; -}; - -struct PamfEpHeader { //12 bytes - be_t value0; //mixed indexN (probably left 2 bits) and nThRefPictureOffset - be_t pts_high; - be_t pts_low; - be_t rpnOffset; -}; - -#pragma pack(pop) - -struct CellPamfReader -{ - //this struct can be used in any way, if it is not accessed directly by virtual CPU - //be_t internalData[16]; - u32 pAddr; - int stream; - u64 fileSize; - u32 internalData[28]; -}; - int pamfStreamTypeToEsFilterId(u8 type, u8 ch, mem_ptr_t pEsFilterId) { //TODO: convert type and ch to EsFilterId @@ -350,7 +104,7 @@ u8 pamfGetStreamType(mem_ptr_t pSelf, u8 stream) u8 pamfGetStreamChannel(mem_ptr_t pSelf, u8 stream) { - cellPamf.Error("TODO: pamfGetStreamChannel"); + cellPamf.Warning("TODO: pamfGetStreamChannel"); //TODO: get stream channel correctly const mem_ptr_t pAddr(pSelf->pAddr); @@ -364,8 +118,11 @@ int cellPamfGetHeaderSize(mem_ptr_t pAddr, u64 fileSize, mem64_t pSi cellPamf.Warning("cellPamfGetHeaderSize(pAddr=0x%x, fileSize=%d, pSize_addr=0x%x)", pAddr.GetAddr(), fileSize, pSize.GetAddr()); + //if ((u32)pAddr->magic != 0x464d4150) + //return CELL_PAMF_ERROR_UNKNOWN_TYPE; + const u64 offset = (u64)pAddr->data_offset << 11; - pSize = offset /*? offset : 2048*/; //hack + pSize = offset ? offset : 2048; //hack return CELL_OK; } @@ -374,20 +131,29 @@ int cellPamfGetHeaderSize2(mem_ptr_t pAddr, u64 fileSize, u32 attrib cellPamf.Warning("cellPamfGetHeaderSize2(pAddr=0x%x, fileSize=%d, attribute=0x%x, pSize_addr=0x%x)", pAddr.GetAddr(), fileSize, attribute, pSize.GetAddr()); + //if ((u32)pAddr->magic != 0x464d4150) + //return CELL_PAMF_ERROR_UNKNOWN_TYPE; + const u64 offset = (u64)pAddr->data_offset << 11; pSize = offset /*? offset : 2048*/; //hack return CELL_OK; } +u32 hack_LastHeader = 0; + int cellPamfGetStreamOffsetAndSize(mem_ptr_t pAddr, u64 fileSize, mem64_t pOffset, mem64_t pSize) { cellPamf.Warning("cellPamfGetStreamOffsetAndSize(pAddr=0x%x, fileSize=%d, pOffset_addr=0x%x, pSize_addr=0x%x)", pAddr.GetAddr(), fileSize, pOffset.GetAddr(), pSize.GetAddr()); + //if ((u32)pAddr->magic != 0x464d4150) + //return CELL_PAMF_ERROR_UNKNOWN_TYPE; + const u64 offset = (u64)pAddr->data_offset << 11; - pOffset = offset /*? offset : 2048*/; //hack + pOffset = offset ? offset : 2048; //hack const u64 size = (u64)pAddr->data_size << 11; - pSize = size /*? size : 4096*/; //hack + pSize = size ? size : (fileSize - 2048); //hack + if (!(u32)pAddr->magic) hack_LastHeader = pAddr.GetAddr(); return CELL_OK; } @@ -401,7 +167,7 @@ int cellPamfReaderInitialize(mem_ptr_t pSelf, mem_ptr_tfileSize = fileSize; @@ -411,7 +177,7 @@ int cellPamfReaderInitialize(mem_ptr_t pSelf, mem_ptr_tfileSize = ((u64)pAddr->data_offset << 11) + ((u64)pAddr->data_size << 11); } pSelf->pAddr = pAddr.GetAddr(); - + if (hack_LastHeader) memcpy(Memory + pAddr.GetAddr(), Memory + hack_LastHeader, 2048); if (attribute & CELL_PAMF_ATTRIBUTE_VERIFY_ON) { //TODO @@ -647,7 +413,7 @@ int cellPamfReaderGetStreamInfo(mem_ptr_t pSelf, u32 pInfo_addr, pInfo->levelIdc = pAVC->levelIdc; pInfo->frameMbsOnlyFlag = 1; //fake - pInfo->frameRateInfo = pAVC->unk0 - 0xc1; + pInfo->frameRateInfo = (pAVC->unk0 & 0x7) - 1; pInfo->aspectRatioIdc = 1; //fake pInfo->horizontalSize = 16 * (u16)pAVC->horizontalSize; @@ -659,7 +425,7 @@ int cellPamfReaderGetStreamInfo(mem_ptr_t pSelf, u32 pInfo_addr, pInfo->matrixCoefficients = 1; //fake //pInfo->deblockingFilterFlag = 1; //??? - cellPamf.Error("TODO: cellPamfReaderGetStreamInfo: CELL_PAMF_STREAM_TYPE_AVC"); + cellPamf.Warning("cellPamfReaderGetStreamInfo: CELL_PAMF_STREAM_TYPE_AVC"); } break; case CELL_PAMF_STREAM_TYPE_M2V: diff --git a/rpcs3/Emu/SysCalls/Modules/cellPamf.h b/rpcs3/Emu/SysCalls/Modules/cellPamf.h new file mode 100644 index 0000000000..b88c473af0 --- /dev/null +++ b/rpcs3/Emu/SysCalls/Modules/cellPamf.h @@ -0,0 +1,335 @@ +#pragma once + +// Error Codes +enum +{ + CELL_PAMF_ERROR_STREAM_NOT_FOUND = 0x80610501, + CELL_PAMF_ERROR_INVALID_PAMF = 0x80610502, + CELL_PAMF_ERROR_INVALID_ARG = 0x80610503, + CELL_PAMF_ERROR_UNKNOWN_TYPE = 0x80610504, + CELL_PAMF_ERROR_UNSUPPORTED_VERSION = 0x80610505, + CELL_PAMF_ERROR_UNKNOWN_STREAM = 0x80610506, + CELL_PAMF_ERROR_EP_NOT_FOUND = 0x80610507, +}; + +// PamfReaderInitialize Attribute Flags +enum +{ + CELL_PAMF_ATTRIBUTE_VERIFY_ON = 1, + CELL_PAMF_ATTRIBUTE_MINIMUM_HEADER = 2, +}; + +enum CellPamfStreamType +{ + CELL_PAMF_STREAM_TYPE_AVC = 0, + CELL_PAMF_STREAM_TYPE_M2V = 1, + CELL_PAMF_STREAM_TYPE_ATRAC3PLUS = 2, + CELL_PAMF_STREAM_TYPE_PAMF_LPCM = 3, + CELL_PAMF_STREAM_TYPE_AC3 = 4, + CELL_PAMF_STREAM_TYPE_USER_DATA = 5, + CELL_PAMF_STREAM_TYPE_VIDEO = 20, + CELL_PAMF_STREAM_TYPE_AUDIO = 21, +}; + +enum +{ + CELL_PAMF_FS_48kHz = 1, +}; + +enum +{ + CELL_PAMF_BIT_LENGTH_16 = 1, + CELL_PAMF_BIT_LENGTH_24 = 3, +}; + +enum +{ + CELL_PAMF_AVC_PROFILE_MAIN = 77, + CELL_PAMF_AVC_PROFILE_HIGH = 100, +}; + +enum +{ + CELL_PAMF_AVC_LEVEL_2P1 = 21, + CELL_PAMF_AVC_LEVEL_3P0 = 30, + CELL_PAMF_AVC_LEVEL_3P1 = 31, + CELL_PAMF_AVC_LEVEL_3P2 = 32, + CELL_PAMF_AVC_LEVEL_4P1 = 41, + CELL_PAMF_AVC_LEVEL_4P2 = 42, +}; + +enum +{ + CELL_PAMF_AVC_FRC_24000DIV1001 = 0, + CELL_PAMF_AVC_FRC_24 = 1, + CELL_PAMF_AVC_FRC_25 = 2, + CELL_PAMF_AVC_FRC_30000DIV1001 = 3, + CELL_PAMF_AVC_FRC_30 = 4, + CELL_PAMF_AVC_FRC_50 = 5, + CELL_PAMF_AVC_FRC_60000DIV1001 = 6, +}; + +enum +{ + CELL_PAMF_M2V_MP_ML = 1, + CELL_PAMF_M2V_MP_H14 = 2, + CELL_PAMF_M2V_MP_HL = 3, + CELL_PAMF_M2V_UNKNOWN = 255, +}; + +enum +{ + CELL_PAMF_M2V_FRC_24000DIV1001 = 1, + CELL_PAMF_M2V_FRC_24 = 2, + CELL_PAMF_M2V_FRC_25 = 3, + CELL_PAMF_M2V_FRC_30000DIV1001 = 4, + CELL_PAMF_M2V_FRC_30 = 5, + CELL_PAMF_M2V_FRC_50 = 6, + CELL_PAMF_M2V_FRC_60000DIV1001 = 7, +}; + +enum +{ + CELL_PAMF_ASPECT_RATIO_1_1 = 1, + CELL_PAMF_ASPECT_RATIO_12_11 = 2, + CELL_PAMF_ASPECT_RATIO_10_11 = 3, + CELL_PAMF_ASPECT_RATIO_16_11 = 4, + CELL_PAMF_ASPECT_RATIO_40_33 = 5, + CELL_PAMF_ASPECT_RATIO_4_3 = 14, +}; + +enum +{ + CELL_PAMF_COLOUR_PRIMARIES_ITR_R_BT_709 = 1, + CELL_PAMF_COLOUR_PRIMARIES_UNSPECIFIED = 2, + CELL_PAMF_COLOUR_PRIMARIES_ITU_R_BT_470_SYS_M = 4, + CELL_PAMF_COLOUR_PRIMARIES_ITU_R_BT_470_SYS_BG = 5, + CELL_PAMF_COLOUR_PRIMARIES_SMPTE_170_M = 6, + CELL_PAMF_COLOUR_PRIMARIES_SMPTE_240_M = 7, + CELL_PAMF_COLOUR_PRIMARIES_GENERIC_FILM = 8, +}; + +enum +{ + CELL_PAMF_TRANSFER_CHARACTERISTICS_ITU_R_BT_709 = 1, + CELL_PAMF_TRANSFER_CHARACTERISTICS_UNSPECIFIED = 2, + CELL_PAMF_TRANSFER_CHARACTERISTICS_ITU_R_BT_470_SYS_M = 4, + CELL_PAMF_TRANSFER_CHARACTERISTICS_ITU_R_BT_470_SYS_BG = 5, + CELL_PAMF_TRANSFER_CHARACTERISTICS_SMPTE_170_M = 6, + CELL_PAMF_TRANSFER_CHARACTERISTICS_SMPTE_240_M = 7, + CELL_PAMF_TRANSFER_CHARACTERISTICS_LINEAR = 8, + CELL_PAMF_TRANSFER_CHARACTERISTICS_LOG_100_1 = 9, + CELL_PAMF_TRANSFER_CHARACTERISTICS_LOG_316_1 = 10, +}; + +enum +{ + CELL_PAMF_MATRIX_GBR = 0, + CELL_PAMF_MATRIX_ITU_R_BT_709 = 1, + CELL_PAMF_MATRIX_UNSPECIFIED = 2, + CELL_PAMF_MATRIX_FCC = 4, + CELL_PAMF_MATRIX_ITU_R_BT_470_SYS_BG = 5, + CELL_PAMF_MATRIX_SMPTE_170_M = 6, + CELL_PAMF_MATRIX_SMPTE_240_M = 7, + CELL_PAMF_MATRIX_YCGCO = 8, +}; + +// Timestamp information (time in increments of 90 kHz) +struct CellCodecTimeStamp { + be_t upper; + be_t lower; +}; + +// Entry point information +struct CellPamfEp { + be_t indexN; + be_t nThRefPictureOffset; + CellCodecTimeStamp pts; + be_t rpnOffset; +}; + +// Entry point iterator +struct CellPamfEpIterator +{ + bool isPamf; + be_t index; + be_t num; + be_t pCur_addr; +}; + +struct CellCodecEsFilterId +{ + be_t filterIdMajor; + be_t filterIdMinor; + be_t supplementalInfo1; + be_t supplementalInfo2; +}; + +// AVC (MPEG4 AVC Video) Specific Information +struct CellPamfAvcInfo { + u8 profileIdc; + u8 levelIdc; + u8 frameMbsOnlyFlag; + u8 videoSignalInfoFlag; + u8 frameRateInfo; + u8 aspectRatioIdc; + be_t sarWidth; //reserved + be_t sarHeight; //reserved + be_t horizontalSize; + be_t verticalSize; + be_t frameCropLeftOffset; //reserved + be_t frameCropRightOffset; //reserved + be_t frameCropTopOffset; //reserved + be_t frameCropBottomOffset; //!!!!! + u8 videoFormat; //reserved + u8 videoFullRangeFlag; + u8 colourPrimaries; + u8 transferCharacteristics; + u8 matrixCoefficients; + u8 entropyCodingModeFlag; //reserved + u8 deblockingFilterFlag; + u8 minNumSlicePerPictureIdc; //reserved + u8 nfwIdc; //reserved + u8 maxMeanBitrate; //reserved +}; + +// M2V (MPEG2 Video) Specific Information +struct CellPamfM2vInfo { + u8 profileAndLevelIndication; + bool progressiveSequence; + u8 videoSignalInfoFlag; + u8 frameRateInfo; + u8 aspectRatioIdc; + be_t sarWidth; + be_t sarHeight; + be_t horizontalSize; + be_t verticalSize; + be_t horizontalSizeValue; + be_t verticalSizeValue; + u8 videoFormat; + u8 videoFullRangeFlag; + u8 colourPrimaries; + u8 transferCharacteristics; + u8 matrixCoefficients; +}; + +// LPCM Audio Specific Information +struct CellPamfLpcmInfo { + be_t samplingFrequency; + u8 numberOfChannels; + be_t bitsPerSample; +}; + +// ATRAC3+ Audio Specific Information +struct CellPamfAtrac3plusInfo { + be_t samplingFrequency; + u8 numberOfChannels; +}; + +// AC3 Audio Specific Information +struct CellPamfAc3Info { + be_t samplingFrequency; + u8 numberOfChannels; +}; + +#pragma pack(push, 1) //file data + +struct PamfStreamHeader_AVC { //AVC specific information + u8 profileIdc; + u8 levelIdc; + u8 unk0; + u8 unk1; //1 + u32 unk2; //0 + be_t horizontalSize; //divided by 16 + be_t verticalSize; //divided by 16 + u32 unk3; //0 + u32 unk4; //0 + u8 unk5; //0xA0 + u8 unk6; //1 + u8 unk7; //1 + u8 unk8; //1 + u8 unk9; //0xB0 + u8 unk10; + u16 unk11; //0 + u32 unk12; //0 +}; + +struct PamfStreamHeader_M2V { //M2V specific information + u8 unknown[32]; //no information yet +}; + +struct PamfStreamHeader_Audio { //Audio specific information + u16 unknown; //== 0 + u8 channels; //number of channels (1, 2, 6 or 8) + u8 freq; //== 1 (always 48000) + u8 bps; //(LPCM only, 0x40 for 16 bit, ???? for 24) + u8 reserved[27]; //probably nothing +}; + +struct PamfStreamHeader //48 bytes +{ + //TODO: look for correct beginning of stream header + u8 type; //0x1B for video (AVC), 0xDC ATRAC3+, 0x80 LPCM, 0xDD userdata + u8 unknown[3]; //0 + //TODO: examine stream_ch encoding + u8 stream_id; + u8 private_stream_id; + u8 unknown1; //????? + u8 unknown2; //????? + //Entry Point Info + be_t ep_offset; //offset of EP section in header + be_t ep_num; //count of EPs + //Specific Info + u8 data[32]; +}; + +struct PamfHeader +{ + u32 magic; //"PAMF" + u32 version; //"0041" (is it const?) + be_t data_offset; //== 2048 >> 11, PAMF headers seem to be always 2048 bytes in size + be_t data_size; //== ((fileSize - 2048) >> 11) + u64 reserved[8]; + be_t table_size; //== size of mapping-table + u16 reserved1; + be_t start_pts_high; + be_t start_pts_low; //Presentation Time Stamp (start) + be_t end_pts_high; + be_t end_pts_low; //Presentation Time Stamp (end) + be_t mux_rate_max; //== 0x01D470 (400 bps per unit, == 48000000 bps) + be_t mux_rate_min; //== 0x0107AC (?????) + u16 reserved2; // ????? + u8 reserved3; + u8 stream_count; //total stream count (reduced to 1 byte) + be_t unk1; //== 1 (?????) + be_t table_data_size; //== table_size - 0x20 == 0x14 + (0x30 * total_stream_num) (?????) + //TODO: check relative offset of stream structs (could be from 0x0c to 0x14, currently 0x14) + be_t start_pts_high2; //????? (probably same values) + be_t start_pts_low2; //????? + be_t end_pts_high2; //????? + be_t end_pts_low2; //????? + be_t unk2; //== 0x10000 (?????) + be_t unk3; // ????? + be_t unk4; // == stream_count + //========================== + PamfStreamHeader stream_headers[256]; +}; + +struct PamfEpHeader { //12 bytes + be_t value0; //mixed indexN (probably left 2 bits) and nThRefPictureOffset + be_t pts_high; + be_t pts_low; + be_t rpnOffset; +}; + +#pragma pack(pop) + +struct CellPamfReader +{ + //this struct can be used in any way, if it is not accessed directly by virtual CPU + //be_t internalData[16]; + u32 pAddr; + int stream; + u64 fileSize; + u32 internalData[28]; +}; \ No newline at end of file diff --git a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp index cf4b158db2..9eb86ebb0a 100644 --- a/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp +++ b/rpcs3/Emu/SysCalls/Modules/sys_fs.cpp @@ -151,16 +151,21 @@ void fsAioRead(u32 fd, mem_ptr_t aio, int xid, mem_func_ptr_toffset); res = nbytes ? file.Read(Memory.GetMemFromAddr(buf_addr), nbytes) : 0; + file.Seek(old_pos); error = CELL_OK; } else @@ -170,8 +175,8 @@ void fsAioRead(u32 fd, mem_ptr_t aio, int xid, mem_func_ptr_toffset, buf_addr, (u64)aio->size, res, xid, path.c_str()); @@ -188,15 +193,17 @@ int cellFsAioRead(mem_ptr_t aio, mem32_t aio_id, mem_func_ptr_t + diff --git a/rpcs3/rpcs3.vcxproj.filters b/rpcs3/rpcs3.vcxproj.filters index 0fa202b3e8..65591d896f 100644 --- a/rpcs3/rpcs3.vcxproj.filters +++ b/rpcs3/rpcs3.vcxproj.filters @@ -367,6 +367,9 @@ Emu\SysCalls\Modules + + Emu\SysCalls\Modules +