public int sceMpegCreate(SceMpegPointer* SceMpegPointer, void* MpegData, int MpegSize, SceMpegRingbuffer* SceMpegRingbuffer, int FrameWidth, int Mode, int DdrTop)
{
//return -1;
var Mpeg = GetMpeg(SceMpegPointer);
if (MpegSize < sceMpegQueryMemSize(0))
{
throw (new SceKernelException(SceKernelErrors.ERROR_MPEG_NO_MEMORY));
}
// Update the ring buffer struct.
if (SceMpegRingbuffer->PacketSize == 0)
{
SceMpegRingbuffer->PacketsAvailable = 0;
}
else
{
SceMpegRingbuffer->PacketsAvailable = (int)((SceMpegRingbuffer->DataEnd.Address - SceMpegRingbuffer->Data.Address) / SceMpegRingbuffer->PacketSize);
}
SceMpegRingbuffer->SceMpeg = Memory.PointerToPspPointer(SceMpegPointer);
SceMpeg* SceMpegData = (SceMpeg*)&((byte*)MpegData)[0x30];
SceMpegPointer->SceMpeg = Memory.PointerToPspPointer(SceMpegData);
PointerUtils.StoreStringOnPtr("LIBMPEG", Encoding.UTF8, SceMpegData->MagicBytes);
PointerUtils.StoreStringOnPtr("001", Encoding.UTF8, SceMpegData->VersionBytes);
SceMpegData->Pad = -1;
SceMpegData->RingBufferAddress = Memory.PointerToPspPointer(SceMpegRingbuffer);
SceMpegData->RingBufferAddressDataUpper = SceMpegRingbuffer->DataEnd;
SceMpegData->FrameWidth = FrameWidth;
SceMpegData->SceMpegAvcMode.Mode = -1;
SceMpegData->SceMpegAvcMode.PixelFormat = GuPixelFormats.RGBA_8888;
SceMpegData->VideoFrameCount = 0;
SceMpegData->AudioFrameCount = 0;
SceMpegRingbuffer->PacketsTotal = 0;
Mpeg.ReadPackets = (int NumPackets) =>
{
return (int)HleInterop.ExecuteFunctionNow(SceMpegRingbuffer->Callback, SceMpegRingbuffer->Data, NumPackets, SceMpegRingbuffer->CallbackParameter);
};
Mpeg._Mpeg = SceMpegPointer;
Mpeg.Data = SceMpegData;
Mpeg.Create();
return 0;
}