From 64a042d7f81dd273a01e6ff02bfdf5804f3f7545 Mon Sep 17 00:00:00 2001 From: oioitff Date: Sun, 30 Jun 2013 20:24:20 +0800 Subject: [PATCH] Correct sceMpegAvcDecode/sceMpegAvcDecodeYCbCr behavior. --- Core/HLE/sceMpeg.cpp | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/Core/HLE/sceMpeg.cpp b/Core/HLE/sceMpeg.cpp index 77cfa16501..77070f56d8 100644 --- a/Core/HLE/sceMpeg.cpp +++ b/Core/HLE/sceMpeg.cpp @@ -651,13 +651,13 @@ u32 sceMpegAvcDecode(u32 mpeg, u32 auAddr, u32 frameWidth, u32 bufferAddr, u32 i avcAu.pts = ctx->mediaengine->getVideoTimeStamp() + ctx->mpegFirstTimestamp; - ctx->avc.avcDecodeResult = MPEG_AVC_DECODE_SUCCESS; - // Flush structs back to memory avcAu.write(auAddr); Memory::WriteStruct(ctx->mpegRingbufferAddr, &ringbuffer); - Memory::Write_U32(ctx->avc.avcFrameStatus, initAddr); // 1 = showing, 0 = not showing + // return 0 in first call, and then return 1, as PSPSDK mentioned + Memory::Write_U32(ctx->avc.avcDecodeResult ? 1 : 0, initAddr); + ctx->avc.avcDecodeResult = MPEG_AVC_DECODE_SUCCESS; DEBUG_LOG(HLE, "sceMpegAvcDecode(%08x, %08x, %i, %08x, %08x)", mpeg, auAddr, frameWidth, bufferAddr, initAddr); @@ -796,13 +796,13 @@ int sceMpegAvcDecodeYCbCr(u32 mpeg, u32 auAddr, u32 bufferAddr, u32 initAddr) avcAu.pts = ctx->mediaengine->getVideoTimeStamp() + ctx->mpegFirstTimestamp; - ctx->avc.avcDecodeResult = MPEG_AVC_DECODE_SUCCESS; - // Flush structs back to memory avcAu.write(auAddr); Memory::WriteStruct(ctx->mpegRingbufferAddr, &ringbuffer); - Memory::Write_U32(ctx->avc.avcFrameStatus, initAddr); // 1 = showing, 0 = not showing + // return 0 in first call, and then return 1, as PSPSDK mentioned + Memory::Write_U32(ctx->avc.avcDecodeResult ? 1 : 0, initAddr); + ctx->avc.avcDecodeResult = MPEG_AVC_DECODE_SUCCESS; DEBUG_LOG(HLE, "sceMpegAvcDecodeYCbCr(%08x, %08x, %08x, %08x)", mpeg, auAddr, bufferAddr, initAddr); @@ -965,11 +965,6 @@ int sceMpegGetAvcAu(u32 mpeg, u32 streamId, u32 auAddr, u32 attrAddr) SceMpegAu sceAu; sceAu.read(auAddr); - if (ctx->avc.avcDecodeResult == 0) { - // return PSP_ERROR_MPEG_NO_DATA at first call before mpegAvcDecode - ctx->avc.avcDecodeResult = MPEG_AVC_DECODE_SUCCESS; - return hleDelayResult(PSP_ERROR_MPEG_NO_DATA, "mpeg get avc", mpegDecodeErrorDelayMs); - } if (mpegRingbuffer.packetsRead == 0 || mpegRingbuffer.packetsFree == mpegRingbuffer.packets) { DEBUG_LOG(HLE, "PSP_ERROR_MPEG_NO_DATA=sceMpegGetAvcAu(%08x, %08x, %08x, %08x)", mpeg, streamId, auAddr, attrAddr); sceAu.pts = -1;