mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-04-16 17:43:11 +00:00
cellPamf update, cellDmux draft
This commit is contained in:
parent
9e06aeff33
commit
d65647acf3
@ -2109,6 +2109,7 @@ private:
|
|||||||
}
|
}
|
||||||
void ISYNC()
|
void ISYNC()
|
||||||
{
|
{
|
||||||
|
_mm_mfence();
|
||||||
}
|
}
|
||||||
void CRXOR(u32 crbd, u32 crba, u32 crbb)
|
void CRXOR(u32 crbd, u32 crba, u32 crbb)
|
||||||
{
|
{
|
||||||
@ -2979,6 +2980,7 @@ private:
|
|||||||
}
|
}
|
||||||
void SYNC(u32 l)
|
void SYNC(u32 l)
|
||||||
{
|
{
|
||||||
|
_mm_mfence();
|
||||||
}
|
}
|
||||||
void LFDX(u32 frd, u32 ra, u32 rb)
|
void LFDX(u32 frd, u32 ra, u32 rb)
|
||||||
{
|
{
|
||||||
|
@ -1,137 +1,148 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "Emu/SysCalls/SysCalls.h"
|
#include "Emu/SysCalls/SysCalls.h"
|
||||||
#include "Emu/SysCalls/SC_FUNC.h"
|
#include "Emu/SysCalls/SC_FUNC.h"
|
||||||
|
#include "cellPamf.h"
|
||||||
|
#include "cellDmux.h"
|
||||||
|
|
||||||
void cellDmux_init();
|
void cellDmux_init();
|
||||||
Module cellDmux(0x0007, cellDmux_init);
|
Module cellDmux(0x0007, cellDmux_init);
|
||||||
|
|
||||||
// Error Codes
|
int cellDmuxQueryAttr(mem_ptr_t<CellDmuxType> demuxerType, mem_ptr_t<CellDmuxAttr> demuxerAttr)
|
||||||
enum
|
|
||||||
{
|
{
|
||||||
CELL_DMUX_ERROR_ARG = 0x80610201,
|
cellDmux.Error("cellDmuxQueryAttr(demuxerType_addr=0x%x, demuxerAttr_addr=0x%x)", demuxerType.GetAddr(), demuxerAttr.GetAddr());
|
||||||
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);
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cellDmuxQueryAttr2()
|
int cellDmuxQueryAttr2(mem_ptr_t<CellDmuxType2> demuxerType2, mem_ptr_t<CellDmuxAttr> demuxerAttr)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED_FUNC(cellDmux);
|
cellDmux.Error("cellDmuxQueryAttr2(demuxerType2_addr=0x%x, demuxerAttr_addr=0x%x)", demuxerType2.GetAddr(), demuxerAttr.GetAddr());
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cellDmuxOpen()
|
int cellDmuxOpen(mem_ptr_t<CellDmuxType> demuxerType, mem_ptr_t<CellDmuxResource> demuxerResource,
|
||||||
|
mem_ptr_t<CellDmuxCb> 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;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cellDmuxOpenEx()
|
int cellDmuxOpenEx(mem_ptr_t<CellDmuxType> demuxerType, mem_ptr_t<CellDmuxResourceEx> demuxerResourceEx,
|
||||||
|
mem_ptr_t<CellDmuxCb> 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;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cellDmuxOpen2()
|
int cellDmuxOpen2(mem_ptr_t<CellDmuxType2> demuxerType2, u32 demuxerResource2_addr,
|
||||||
|
mem_ptr_t<CellDmuxCb> 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;
|
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;
|
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;
|
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;
|
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;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cellDmuxQueryEsAttr()
|
int cellDmuxQueryEsAttr(mem_ptr_t<CellDmuxType> demuxerType, mem_ptr_t<CellCodecEsFilterId> esFilterId,
|
||||||
|
u32 esSpecificInfo_addr, mem_ptr_t<CellDmuxEsAttr> 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;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cellDmuxQueryEsAttr2()
|
int cellDmuxQueryEsAttr2(mem_ptr_t<CellDmuxType2> demuxerType2, mem_ptr_t<CellCodecEsFilterId> esFilterId,
|
||||||
|
u32 esSpecificInfo_addr, mem_ptr_t<CellDmuxEsAttr> 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;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cellDmuxEnableEs()
|
int cellDmuxEnableEs(u32 demuxerHandle_addr, mem_ptr_t<CellCodecEsFilterId> esFilterId,
|
||||||
|
mem_ptr_t<CellDmuxEsResource> esResourceInfo, mem_ptr_t<CellDmuxEsCb> 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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
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;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
143
rpcs3/Emu/SysCalls/Modules/cellDmux.h
Normal file
143
rpcs3/Emu/SysCalls/Modules/cellDmux.h
Normal file
@ -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<CellDmuxMsgType> msgType; //CellDmuxMsgType enum
|
||||||
|
be_t<u64> supplementalInfo;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxEsMsg
|
||||||
|
{
|
||||||
|
be_t<CellDmuxEsMsgType> msgType; //CellDmuxEsMsgType enum
|
||||||
|
be_t<u64> supplementalInfo;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxType
|
||||||
|
{
|
||||||
|
CellDmuxStreamType streamType;
|
||||||
|
be_t<u32> reserved[2]; //0
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxType2
|
||||||
|
{
|
||||||
|
CellDmuxStreamType streamType;
|
||||||
|
be_t<u32> streamSpecificInfo_addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxResource
|
||||||
|
{
|
||||||
|
be_t<u32> memAddr;
|
||||||
|
be_t<u32> memSize;
|
||||||
|
be_t<u32> ppuThreadPriority;
|
||||||
|
be_t<u32> ppuThreadStackSize;
|
||||||
|
be_t<u32> spuThreadPriority;
|
||||||
|
be_t<u32> numOfSpus;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxResourceEx
|
||||||
|
{
|
||||||
|
be_t<u32> memAddr;
|
||||||
|
be_t<u32> memSize;
|
||||||
|
be_t<u32> ppuThreadPriority;
|
||||||
|
be_t<u32> ppuThreadStackSize;
|
||||||
|
be_t<u32> spurs_addr;
|
||||||
|
u8 priority[8];
|
||||||
|
be_t<u32> maxContention;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxResource2Ex
|
||||||
|
{
|
||||||
|
bool isResourceEx; //true
|
||||||
|
CellDmuxResourceEx resourceEx;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxResource2NoEx
|
||||||
|
{
|
||||||
|
bool isResourceEx; //false
|
||||||
|
CellDmuxResource resource;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxCb
|
||||||
|
{
|
||||||
|
// CellDmuxCbMsg callback
|
||||||
|
mem_func_ptr_t<void (*)(u32 demuxerHandle_addr, mem_ptr_t<CellDmuxMsg> demuxerMsg, u32 cbArg_addr)> cbMsgFunc;
|
||||||
|
be_t<u32> cbArg_addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxEsCb
|
||||||
|
{
|
||||||
|
// CellDmuxCbEsMsg callback
|
||||||
|
mem_func_ptr_t<void (*)(u32 demuxerHandle_addr, u32 esHandle_addr, mem_ptr_t<CellDmuxEsMsg> esMsg, u32 cbArg_addr)> cbEsMsgFunc;
|
||||||
|
be_t<u32> cbArg_addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxAttr
|
||||||
|
{
|
||||||
|
be_t<u32> memSize;
|
||||||
|
be_t<u32> demuxerVerUpper;
|
||||||
|
be_t<u32> demuxerVerLower;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxEsAttr
|
||||||
|
{
|
||||||
|
be_t<u32> memSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxEsResource
|
||||||
|
{
|
||||||
|
be_t<u32> memAddr;
|
||||||
|
be_t<u32> memSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxAuInfo
|
||||||
|
{
|
||||||
|
be_t<u32> auAddr;
|
||||||
|
be_t<u32> auSize;
|
||||||
|
be_t<u32> auMaxSize;
|
||||||
|
be_t<u64> userData;
|
||||||
|
be_t<u32> ptsUpper;
|
||||||
|
be_t<u32> ptsLower;
|
||||||
|
be_t<u32> dtsUpper;
|
||||||
|
be_t<u32> dtsLower;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellDmuxAuInfoEx
|
||||||
|
{
|
||||||
|
be_t<u32> auAddr;
|
||||||
|
be_t<u32> auSize;
|
||||||
|
be_t<u32> reserved;
|
||||||
|
bool isRap;
|
||||||
|
be_t<u64> userData;
|
||||||
|
CellCodecTimeStamp pts;
|
||||||
|
CellCodecTimeStamp dts;
|
||||||
|
};
|
@ -1,257 +1,11 @@
|
|||||||
#include "stdafx.h"
|
#include "stdafx.h"
|
||||||
#include "Emu/SysCalls/SysCalls.h"
|
#include "Emu/SysCalls/SysCalls.h"
|
||||||
#include "Emu/SysCalls/SC_FUNC.h"
|
#include "Emu/SysCalls/SC_FUNC.h"
|
||||||
|
#include "cellPamf.h"
|
||||||
|
|
||||||
void cellPamf_init();
|
void cellPamf_init();
|
||||||
Module cellPamf(0x0012, 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<u32> upper;
|
|
||||||
be_t<u32> lower;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Entry point information
|
|
||||||
struct CellPamfEp {
|
|
||||||
be_t<u32> indexN;
|
|
||||||
be_t<u32> nThRefPictureOffset;
|
|
||||||
CellCodecTimeStamp pts;
|
|
||||||
be_t<u64> rpnOffset;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Entry point iterator
|
|
||||||
struct CellPamfEpIterator {
|
|
||||||
be_t<bool> isPamf;
|
|
||||||
be_t<u32> index;
|
|
||||||
be_t<u32> num;
|
|
||||||
be_t<u32> pCur_addr;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct CellCodecEsFilterId {
|
|
||||||
be_t<u32> filterIdMajor;
|
|
||||||
be_t<u32> filterIdMinor;
|
|
||||||
be_t<u32> supplementalInfo1;
|
|
||||||
be_t<u32> supplementalInfo2;
|
|
||||||
};
|
|
||||||
|
|
||||||
// AVC (MPEG4 AVC Video) Specific Information
|
|
||||||
struct CellPamfAvcInfo {
|
|
||||||
u8 profileIdc;
|
|
||||||
u8 levelIdc;
|
|
||||||
u8 frameMbsOnlyFlag;
|
|
||||||
u8 videoSignalInfoFlag;
|
|
||||||
u8 frameRateInfo;
|
|
||||||
u8 aspectRatioIdc;
|
|
||||||
be_t<u16> sarWidth; //reserved
|
|
||||||
be_t<u16> sarHeight; //reserved
|
|
||||||
be_t<u16> horizontalSize;
|
|
||||||
be_t<u16> verticalSize;
|
|
||||||
be_t<u16> frameCropLeftOffset; //reserved
|
|
||||||
be_t<u16> frameCropRightOffset; //reserved
|
|
||||||
be_t<u16> frameCropTopOffset; //reserved
|
|
||||||
be_t<u16> 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<bool> progressiveSequence;
|
|
||||||
u8 videoSignalInfoFlag;
|
|
||||||
u8 frameRateInfo;
|
|
||||||
u8 aspectRatioIdc;
|
|
||||||
be_t<u16> sarWidth;
|
|
||||||
be_t<u16> sarHeight;
|
|
||||||
be_t<u16> horizontalSize;
|
|
||||||
be_t<u16> verticalSize;
|
|
||||||
be_t<u16> horizontalSizeValue;
|
|
||||||
be_t<u16> verticalSizeValue;
|
|
||||||
u8 videoFormat;
|
|
||||||
u8 videoFullRangeFlag;
|
|
||||||
u8 colourPrimaries;
|
|
||||||
u8 transferCharacteristics;
|
|
||||||
u8 matrixCoefficients;
|
|
||||||
};
|
|
||||||
|
|
||||||
// LPCM Audio Specific Information
|
|
||||||
struct CellPamfLpcmInfo {
|
|
||||||
be_t<u32> samplingFrequency;
|
|
||||||
u8 numberOfChannels;
|
|
||||||
be_t<u16> bitsPerSample;
|
|
||||||
};
|
|
||||||
|
|
||||||
// ATRAC3+ Audio Specific Information
|
|
||||||
struct CellPamfAtrac3plusInfo {
|
|
||||||
be_t<u32> samplingFrequency;
|
|
||||||
u8 numberOfChannels;
|
|
||||||
};
|
|
||||||
|
|
||||||
// AC3 Audio Specific Information
|
|
||||||
struct CellPamfAc3Info {
|
|
||||||
be_t<u32> 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<u16> horizontalSize; //divided by 16
|
|
||||||
be_t<u16> 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<u32> ep_offset; //offset of EP section in header
|
|
||||||
be_t<u32> ep_num; //count of EPs
|
|
||||||
//Specific Info
|
|
||||||
u8 data[32];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PamfHeader
|
|
||||||
{
|
|
||||||
u32 magic; //"PAMF"
|
|
||||||
u32 version; //"0041" (is it const?)
|
|
||||||
be_t<u32> data_offset; //== 2048 >> 11, PAMF headers seem to be always 2048 bytes in size
|
|
||||||
be_t<u32> data_size; //== ((fileSize - 2048) >> 11)
|
|
||||||
u64 reserved[8];
|
|
||||||
be_t<u32> table_size; //== size of mapping-table
|
|
||||||
u16 reserved1;
|
|
||||||
be_t<u16> start_pts_high;
|
|
||||||
be_t<u32> start_pts_low; //Presentation Time Stamp (start)
|
|
||||||
be_t<u16> end_pts_high;
|
|
||||||
be_t<u32> end_pts_low; //Presentation Time Stamp (end)
|
|
||||||
be_t<u32> mux_rate_max; //== 0x01D470 (400 bps per unit, == 48000000 bps)
|
|
||||||
be_t<u32> mux_rate_min; //== 0x0107AC (?????)
|
|
||||||
u16 reserved2; // ?????
|
|
||||||
u8 reserved3;
|
|
||||||
u8 stream_count; //total stream count (reduced to 1 byte)
|
|
||||||
be_t<u16> unk1; //== 1 (?????)
|
|
||||||
be_t<u32> 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<u16> start_pts_high2; //????? (probably same values)
|
|
||||||
be_t<u32> start_pts_low2; //?????
|
|
||||||
be_t<u16> end_pts_high2; //?????
|
|
||||||
be_t<u32> end_pts_low2; //?????
|
|
||||||
be_t<u32> unk2; //== 0x10000 (?????)
|
|
||||||
be_t<u16> unk3; // ?????
|
|
||||||
be_t<u16> unk4; // == stream_count
|
|
||||||
//==========================
|
|
||||||
PamfStreamHeader stream_headers[256];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct PamfEpHeader { //12 bytes
|
|
||||||
be_t<u16> value0; //mixed indexN (probably left 2 bits) and nThRefPictureOffset
|
|
||||||
be_t<u16> pts_high;
|
|
||||||
be_t<u32> pts_low;
|
|
||||||
be_t<u32> 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<u64> internalData[16];
|
|
||||||
u32 pAddr;
|
|
||||||
int stream;
|
|
||||||
u64 fileSize;
|
|
||||||
u32 internalData[28];
|
|
||||||
};
|
|
||||||
|
|
||||||
int pamfStreamTypeToEsFilterId(u8 type, u8 ch, mem_ptr_t<CellCodecEsFilterId> pEsFilterId)
|
int pamfStreamTypeToEsFilterId(u8 type, u8 ch, mem_ptr_t<CellCodecEsFilterId> pEsFilterId)
|
||||||
{
|
{
|
||||||
//TODO: convert type and ch to EsFilterId
|
//TODO: convert type and ch to EsFilterId
|
||||||
@ -350,7 +104,7 @@ u8 pamfGetStreamType(mem_ptr_t<CellPamfReader> pSelf, u8 stream)
|
|||||||
|
|
||||||
u8 pamfGetStreamChannel(mem_ptr_t<CellPamfReader> pSelf, u8 stream)
|
u8 pamfGetStreamChannel(mem_ptr_t<CellPamfReader> pSelf, u8 stream)
|
||||||
{
|
{
|
||||||
cellPamf.Error("TODO: pamfGetStreamChannel");
|
cellPamf.Warning("TODO: pamfGetStreamChannel");
|
||||||
//TODO: get stream channel correctly
|
//TODO: get stream channel correctly
|
||||||
const mem_ptr_t<PamfHeader> pAddr(pSelf->pAddr);
|
const mem_ptr_t<PamfHeader> pAddr(pSelf->pAddr);
|
||||||
|
|
||||||
@ -364,8 +118,11 @@ int cellPamfGetHeaderSize(mem_ptr_t<PamfHeader> pAddr, u64 fileSize, mem64_t pSi
|
|||||||
cellPamf.Warning("cellPamfGetHeaderSize(pAddr=0x%x, fileSize=%d, pSize_addr=0x%x)",
|
cellPamf.Warning("cellPamfGetHeaderSize(pAddr=0x%x, fileSize=%d, pSize_addr=0x%x)",
|
||||||
pAddr.GetAddr(), fileSize, pSize.GetAddr());
|
pAddr.GetAddr(), fileSize, pSize.GetAddr());
|
||||||
|
|
||||||
|
//if ((u32)pAddr->magic != 0x464d4150)
|
||||||
|
//return CELL_PAMF_ERROR_UNKNOWN_TYPE;
|
||||||
|
|
||||||
const u64 offset = (u64)pAddr->data_offset << 11;
|
const u64 offset = (u64)pAddr->data_offset << 11;
|
||||||
pSize = offset /*? offset : 2048*/; //hack
|
pSize = offset ? offset : 2048; //hack
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -374,20 +131,29 @@ int cellPamfGetHeaderSize2(mem_ptr_t<PamfHeader> pAddr, u64 fileSize, u32 attrib
|
|||||||
cellPamf.Warning("cellPamfGetHeaderSize2(pAddr=0x%x, fileSize=%d, attribute=0x%x, pSize_addr=0x%x)",
|
cellPamf.Warning("cellPamfGetHeaderSize2(pAddr=0x%x, fileSize=%d, attribute=0x%x, pSize_addr=0x%x)",
|
||||||
pAddr.GetAddr(), fileSize, attribute, pSize.GetAddr());
|
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;
|
const u64 offset = (u64)pAddr->data_offset << 11;
|
||||||
pSize = offset /*? offset : 2048*/; //hack
|
pSize = offset /*? offset : 2048*/; //hack
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u32 hack_LastHeader = 0;
|
||||||
|
|
||||||
int cellPamfGetStreamOffsetAndSize(mem_ptr_t<PamfHeader> pAddr, u64 fileSize, mem64_t pOffset, mem64_t pSize)
|
int cellPamfGetStreamOffsetAndSize(mem_ptr_t<PamfHeader> 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)",
|
cellPamf.Warning("cellPamfGetStreamOffsetAndSize(pAddr=0x%x, fileSize=%d, pOffset_addr=0x%x, pSize_addr=0x%x)",
|
||||||
pAddr.GetAddr(), fileSize, pOffset.GetAddr(), pSize.GetAddr());
|
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;
|
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;
|
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;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -411,7 +177,7 @@ int cellPamfReaderInitialize(mem_ptr_t<CellPamfReader> pSelf, mem_ptr_t<PamfHead
|
|||||||
pSelf->fileSize = ((u64)pAddr->data_offset << 11) + ((u64)pAddr->data_size << 11);
|
pSelf->fileSize = ((u64)pAddr->data_offset << 11) + ((u64)pAddr->data_size << 11);
|
||||||
}
|
}
|
||||||
pSelf->pAddr = pAddr.GetAddr();
|
pSelf->pAddr = pAddr.GetAddr();
|
||||||
|
if (hack_LastHeader) memcpy(Memory + pAddr.GetAddr(), Memory + hack_LastHeader, 2048);
|
||||||
if (attribute & CELL_PAMF_ATTRIBUTE_VERIFY_ON)
|
if (attribute & CELL_PAMF_ATTRIBUTE_VERIFY_ON)
|
||||||
{
|
{
|
||||||
//TODO
|
//TODO
|
||||||
@ -647,7 +413,7 @@ int cellPamfReaderGetStreamInfo(mem_ptr_t<CellPamfReader> pSelf, u32 pInfo_addr,
|
|||||||
pInfo->levelIdc = pAVC->levelIdc;
|
pInfo->levelIdc = pAVC->levelIdc;
|
||||||
|
|
||||||
pInfo->frameMbsOnlyFlag = 1; //fake
|
pInfo->frameMbsOnlyFlag = 1; //fake
|
||||||
pInfo->frameRateInfo = pAVC->unk0 - 0xc1;
|
pInfo->frameRateInfo = (pAVC->unk0 & 0x7) - 1;
|
||||||
pInfo->aspectRatioIdc = 1; //fake
|
pInfo->aspectRatioIdc = 1; //fake
|
||||||
|
|
||||||
pInfo->horizontalSize = 16 * (u16)pAVC->horizontalSize;
|
pInfo->horizontalSize = 16 * (u16)pAVC->horizontalSize;
|
||||||
@ -659,7 +425,7 @@ int cellPamfReaderGetStreamInfo(mem_ptr_t<CellPamfReader> pSelf, u32 pInfo_addr,
|
|||||||
pInfo->matrixCoefficients = 1; //fake
|
pInfo->matrixCoefficients = 1; //fake
|
||||||
//pInfo->deblockingFilterFlag = 1; //???
|
//pInfo->deblockingFilterFlag = 1; //???
|
||||||
|
|
||||||
cellPamf.Error("TODO: cellPamfReaderGetStreamInfo: CELL_PAMF_STREAM_TYPE_AVC");
|
cellPamf.Warning("cellPamfReaderGetStreamInfo: CELL_PAMF_STREAM_TYPE_AVC");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CELL_PAMF_STREAM_TYPE_M2V:
|
case CELL_PAMF_STREAM_TYPE_M2V:
|
||||||
|
335
rpcs3/Emu/SysCalls/Modules/cellPamf.h
Normal file
335
rpcs3/Emu/SysCalls/Modules/cellPamf.h
Normal file
@ -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<u32> upper;
|
||||||
|
be_t<u32> lower;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Entry point information
|
||||||
|
struct CellPamfEp {
|
||||||
|
be_t<u32> indexN;
|
||||||
|
be_t<u32> nThRefPictureOffset;
|
||||||
|
CellCodecTimeStamp pts;
|
||||||
|
be_t<u64> rpnOffset;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Entry point iterator
|
||||||
|
struct CellPamfEpIterator
|
||||||
|
{
|
||||||
|
bool isPamf;
|
||||||
|
be_t<u32> index;
|
||||||
|
be_t<u32> num;
|
||||||
|
be_t<u32> pCur_addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CellCodecEsFilterId
|
||||||
|
{
|
||||||
|
be_t<u32> filterIdMajor;
|
||||||
|
be_t<u32> filterIdMinor;
|
||||||
|
be_t<u32> supplementalInfo1;
|
||||||
|
be_t<u32> supplementalInfo2;
|
||||||
|
};
|
||||||
|
|
||||||
|
// AVC (MPEG4 AVC Video) Specific Information
|
||||||
|
struct CellPamfAvcInfo {
|
||||||
|
u8 profileIdc;
|
||||||
|
u8 levelIdc;
|
||||||
|
u8 frameMbsOnlyFlag;
|
||||||
|
u8 videoSignalInfoFlag;
|
||||||
|
u8 frameRateInfo;
|
||||||
|
u8 aspectRatioIdc;
|
||||||
|
be_t<u16> sarWidth; //reserved
|
||||||
|
be_t<u16> sarHeight; //reserved
|
||||||
|
be_t<u16> horizontalSize;
|
||||||
|
be_t<u16> verticalSize;
|
||||||
|
be_t<u16> frameCropLeftOffset; //reserved
|
||||||
|
be_t<u16> frameCropRightOffset; //reserved
|
||||||
|
be_t<u16> frameCropTopOffset; //reserved
|
||||||
|
be_t<u16> 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<u16> sarWidth;
|
||||||
|
be_t<u16> sarHeight;
|
||||||
|
be_t<u16> horizontalSize;
|
||||||
|
be_t<u16> verticalSize;
|
||||||
|
be_t<u16> horizontalSizeValue;
|
||||||
|
be_t<u16> verticalSizeValue;
|
||||||
|
u8 videoFormat;
|
||||||
|
u8 videoFullRangeFlag;
|
||||||
|
u8 colourPrimaries;
|
||||||
|
u8 transferCharacteristics;
|
||||||
|
u8 matrixCoefficients;
|
||||||
|
};
|
||||||
|
|
||||||
|
// LPCM Audio Specific Information
|
||||||
|
struct CellPamfLpcmInfo {
|
||||||
|
be_t<u32> samplingFrequency;
|
||||||
|
u8 numberOfChannels;
|
||||||
|
be_t<u16> bitsPerSample;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ATRAC3+ Audio Specific Information
|
||||||
|
struct CellPamfAtrac3plusInfo {
|
||||||
|
be_t<u32> samplingFrequency;
|
||||||
|
u8 numberOfChannels;
|
||||||
|
};
|
||||||
|
|
||||||
|
// AC3 Audio Specific Information
|
||||||
|
struct CellPamfAc3Info {
|
||||||
|
be_t<u32> 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<u16> horizontalSize; //divided by 16
|
||||||
|
be_t<u16> 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<u32> ep_offset; //offset of EP section in header
|
||||||
|
be_t<u32> ep_num; //count of EPs
|
||||||
|
//Specific Info
|
||||||
|
u8 data[32];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PamfHeader
|
||||||
|
{
|
||||||
|
u32 magic; //"PAMF"
|
||||||
|
u32 version; //"0041" (is it const?)
|
||||||
|
be_t<u32> data_offset; //== 2048 >> 11, PAMF headers seem to be always 2048 bytes in size
|
||||||
|
be_t<u32> data_size; //== ((fileSize - 2048) >> 11)
|
||||||
|
u64 reserved[8];
|
||||||
|
be_t<u32> table_size; //== size of mapping-table
|
||||||
|
u16 reserved1;
|
||||||
|
be_t<u16> start_pts_high;
|
||||||
|
be_t<u32> start_pts_low; //Presentation Time Stamp (start)
|
||||||
|
be_t<u16> end_pts_high;
|
||||||
|
be_t<u32> end_pts_low; //Presentation Time Stamp (end)
|
||||||
|
be_t<u32> mux_rate_max; //== 0x01D470 (400 bps per unit, == 48000000 bps)
|
||||||
|
be_t<u32> mux_rate_min; //== 0x0107AC (?????)
|
||||||
|
u16 reserved2; // ?????
|
||||||
|
u8 reserved3;
|
||||||
|
u8 stream_count; //total stream count (reduced to 1 byte)
|
||||||
|
be_t<u16> unk1; //== 1 (?????)
|
||||||
|
be_t<u32> 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<u16> start_pts_high2; //????? (probably same values)
|
||||||
|
be_t<u32> start_pts_low2; //?????
|
||||||
|
be_t<u16> end_pts_high2; //?????
|
||||||
|
be_t<u32> end_pts_low2; //?????
|
||||||
|
be_t<u32> unk2; //== 0x10000 (?????)
|
||||||
|
be_t<u16> unk3; // ?????
|
||||||
|
be_t<u16> unk4; // == stream_count
|
||||||
|
//==========================
|
||||||
|
PamfStreamHeader stream_headers[256];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PamfEpHeader { //12 bytes
|
||||||
|
be_t<u16> value0; //mixed indexN (probably left 2 bits) and nThRefPictureOffset
|
||||||
|
be_t<u16> pts_high;
|
||||||
|
be_t<u32> pts_low;
|
||||||
|
be_t<u32> 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<u64> internalData[16];
|
||||||
|
u32 pAddr;
|
||||||
|
int stream;
|
||||||
|
u64 fileSize;
|
||||||
|
u32 internalData[28];
|
||||||
|
};
|
@ -151,16 +151,21 @@ void fsAioRead(u32 fd, mem_ptr_t<CellFsAio> aio, int xid, mem_func_ptr_t<void (*
|
|||||||
|
|
||||||
if(Memory.IsGoodAddr(buf_addr))
|
if(Memory.IsGoodAddr(buf_addr))
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
//open the file again (to prevent access conflicts roughly)
|
//open the file again (to prevent access conflicts roughly)
|
||||||
vfsLocalFile file(path, vfsRead);
|
vfsLocalFile file(path, vfsRead);
|
||||||
|
*/
|
||||||
|
vfsStream& file = *(vfsStream*)FDs[fd];
|
||||||
if(!Memory.IsGoodAddr(buf_addr, nbytes))
|
if(!Memory.IsGoodAddr(buf_addr, nbytes))
|
||||||
{
|
{
|
||||||
MemoryBlock& block = Memory.GetMemByAddr(buf_addr);
|
MemoryBlock& block = Memory.GetMemByAddr(buf_addr);
|
||||||
nbytes = block.GetSize() - (buf_addr - block.GetStartAddr());
|
nbytes = block.GetSize() - (buf_addr - block.GetStartAddr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const u64 old_pos = file.Tell();
|
||||||
file.Seek((u64)aio->offset);
|
file.Seek((u64)aio->offset);
|
||||||
res = nbytes ? file.Read(Memory.GetMemFromAddr(buf_addr), nbytes) : 0;
|
res = nbytes ? file.Read(Memory.GetMemFromAddr(buf_addr), nbytes) : 0;
|
||||||
|
file.Seek(old_pos);
|
||||||
error = CELL_OK;
|
error = CELL_OK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -170,8 +175,8 @@ void fsAioRead(u32 fd, mem_ptr_t<CellFsAio> aio, int xid, mem_func_ptr_t<void (*
|
|||||||
}
|
}
|
||||||
|
|
||||||
//start callback thread
|
//start callback thread
|
||||||
//if(func)
|
if(func)
|
||||||
//func.async(aio.GetAddr(), error, xid, res);
|
func.async(aio.GetAddr(), error, xid, res);
|
||||||
|
|
||||||
ConLog.Warning("*** fsAioRead(fd=%d, offset=0x%llx, buf_addr=0x%x, size=%d, res=%d, xid=%d [%s])",
|
ConLog.Warning("*** fsAioRead(fd=%d, offset=0x%llx, buf_addr=0x%x, size=%d, res=%d, xid=%d [%s])",
|
||||||
fd, (u64)aio->offset, buf_addr, (u64)aio->size, res, xid, path.c_str());
|
fd, (u64)aio->offset, buf_addr, (u64)aio->size, res, xid, path.c_str());
|
||||||
@ -188,15 +193,17 @@ int cellFsAioRead(mem_ptr_t<CellFsAio> aio, mem32_t aio_id, mem_func_ptr_t<void
|
|||||||
//vfsFileBase& orig_file = *(vfsFileBase*)id.m_data;
|
//vfsFileBase& orig_file = *(vfsFileBase*)id.m_data;
|
||||||
vfsFileBase& orig_file = *(vfsFileBase*)FDs[fd];
|
vfsFileBase& orig_file = *(vfsFileBase*)FDs[fd];
|
||||||
|
|
||||||
//get a unique id for the callback
|
//get a unique id for the callback (may be used by cellFsAioCancel)
|
||||||
const u32 xid = g_FsAioReadID++;
|
const u32 xid = g_FsAioReadID++;
|
||||||
aio_id = xid;
|
|
||||||
|
|
||||||
|
//read data in another thread (doesn't work correctly):
|
||||||
//std::thread t(fsAioRead, fd, aio, xid, func);
|
//std::thread t(fsAioRead, fd, aio, xid, func);
|
||||||
//t.detach();
|
//t.detach();
|
||||||
//read data immediately (actually it should be read in special thread):
|
//read data immediately (actually it should be read in special thread):
|
||||||
fsAioRead(fd, aio, xid, func);
|
fsAioRead(fd, aio, xid, func);
|
||||||
|
|
||||||
|
aio_id = xid;
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -267,6 +267,7 @@
|
|||||||
<ClCompile Include="Emu\SysCalls\lv2\SC_VM.cpp" />
|
<ClCompile Include="Emu\SysCalls\lv2\SC_VM.cpp" />
|
||||||
<ClCompile Include="Emu\SysCalls\Modules.cpp" />
|
<ClCompile Include="Emu\SysCalls\Modules.cpp" />
|
||||||
<ClCompile Include="Emu\SysCalls\Modules\cellAudio.cpp" />
|
<ClCompile Include="Emu\SysCalls\Modules\cellAudio.cpp" />
|
||||||
|
<ClCompile Include="Emu\SysCalls\Modules\cellDmux.cpp" />
|
||||||
<ClCompile Include="Emu\SysCalls\Modules\cellFont.cpp" />
|
<ClCompile Include="Emu\SysCalls\Modules\cellFont.cpp" />
|
||||||
<ClCompile Include="Emu\SysCalls\Modules\cellFontFT.cpp" />
|
<ClCompile Include="Emu\SysCalls\Modules\cellFontFT.cpp" />
|
||||||
<ClCompile Include="Emu\SysCalls\Modules\cellGame.cpp" />
|
<ClCompile Include="Emu\SysCalls\Modules\cellGame.cpp" />
|
||||||
|
@ -367,6 +367,9 @@
|
|||||||
<ClCompile Include="Emu\SysCalls\Modules\cellPamf.cpp">
|
<ClCompile Include="Emu\SysCalls\Modules\cellPamf.cpp">
|
||||||
<Filter>Emu\SysCalls\Modules</Filter>
|
<Filter>Emu\SysCalls\Modules</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="Emu\SysCalls\Modules\cellDmux.cpp">
|
||||||
|
<Filter>Emu\SysCalls\Modules</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ResourceCompile Include="rpcs3.rc" />
|
<ResourceCompile Include="rpcs3.rc" />
|
||||||
|
Loading…
x
Reference in New Issue
Block a user