From 03e1497f34c4add248ad2bb492d238bdd583fee1 Mon Sep 17 00:00:00 2001 From: kalaposfos13 <153381648+kalaposfos13@users.noreply.github.com> Date: Sat, 4 Jul 2026 16:08:48 +0200 Subject: [PATCH] Fix Camera issues found in Burnout Paradise Remastered (#4668) * Populate pFramePointerListGarlic in sceCameraGetFrameData * More explicitly tell the apps that a frame isn't valid * remove hacky global variable * fix maybe UB --- src/core/libraries/camera/camera.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/core/libraries/camera/camera.cpp b/src/core/libraries/camera/camera.cpp index cfef9ef64..985f2bb6f 100644 --- a/src/core/libraries/camera/camera.cpp +++ b/src/core/libraries/camera/camera.cpp @@ -402,7 +402,12 @@ static void ConvertRGBA8888ToRAW8(const u8* src, u8* dst, int width, int height) s32 PS4_SYSV_ABI sceCameraGetFrameData(s32 handle, OrbisCameraFrameData* frame_data) { LOG_DEBUG(Lib_Camera, "called"); - if (handle < 1 || frame_data == nullptr || frame_data->sizeThis > 584) { + if (frame_data == nullptr) { + return ORBIS_CAMERA_ERROR_PARAM; + } + frame_data->status[0] = -1; + frame_data->status[1] = -1; + if (handle < 1 || frame_data->sizeThis > 584) { return ORBIS_CAMERA_ERROR_PARAM; } if (!g_library_opened || !sdl_camera) { @@ -418,6 +423,8 @@ s32 PS4_SYSV_ABI sceCameraGetFrameData(s32 handle, OrbisCameraFrameData* frame_d } frame = SDL_AcquireCameraFrame(sdl_camera, ×tampNS); + frame_data->status[0] = frame != nullptr ? 0 : -1; + frame_data->status[1] = frame != nullptr ? 0 : -1; if (!frame) { return ORBIS_CAMERA_ERROR_BUSY; } @@ -454,6 +461,9 @@ s32 PS4_SYSV_ABI sceCameraGetFrameData(s32 handle, OrbisCameraFrameData* frame_d } frame_data->meta.format[0][0] = output_config0.format.formatLevel0; frame_data->meta.format[1][0] = output_config1.format.formatLevel0; + // not fully correct, but good enough + frame_data->pFramePointerListGarlic[0][0] = frame_data->pFramePointerList[0][0]; + frame_data->pFramePointerListGarlic[1][0] = frame_data->pFramePointerList[1][0]; return ORBIS_OK; } @@ -642,7 +652,7 @@ s32 PS4_SYSV_ABI sceCameraIsValidFrameData(s32 handle, OrbisCameraFrameData* fra return ORBIS_CAMERA_ERROR_NOT_OPEN; } - return 1; // valid + return frame_data->status[0] == 0 && frame_data->status[1] == 0; } s32 PS4_SYSV_ABI sceCameraOpen(Libraries::UserService::OrbisUserServiceUserId user_id, s32 type,