Libraries: Better libSceCamera stubs (#3434)

* Initial work on improved stubs

Simulates library behaviors for when a camera is not connected.

* Get* functions complete

I ended up leaving some stubs behind, but most of what I didn't do seem to be internal functions called by other libraries we'd be running HLE anyway.

* Finished stubs

Everything I can reasonably confirm the behavior of should behave as expected, emulating the behavior of a PS4 with no camera attached.

* sceCameraStart firmware check

This check only applies to higher eboot firmwares, since my previous test eboots used firmware 1.00 I completely missed this.

* sceCameraGetAutoExposureGain fix

When option is provided and valid, size is also set to 0.

* Track opened handles

Extremely basic for now, if the library was ever properly implemented this could be swapped for a map of some kind instead.

* Fix errors for sceCameraStart

The firmware-related parameter checks come after the library opened check.

* Promote sceCameraIsAttached log to info

Since you don't need to initialize the library to call this function, some games will call sceCameraIsAttached before anything else.
This commit is contained in:
Stephen Miller
2025-08-19 20:36:07 -05:00
committed by GitHub
parent 68e35d57d2
commit 07bae57a16
2 changed files with 729 additions and 200 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -12,8 +12,9 @@ class SymbolsResolver;
namespace Libraries::Camera { namespace Libraries::Camera {
constexpr int ORBIS_CAMERA_MAX_DEVICE_NUM = 2; constexpr s32 ORBIS_CAMERA_MAX_DEVICE_NUM = 2;
constexpr int ORBIS_CAMERA_MAX_FORMAT_LEVEL_NUM = 4; constexpr s32 ORBIS_CAMERA_MAX_FORMAT_LEVEL_NUM = 4;
constexpr s32 ORBIS_CAMERA_CALIBRATION_DATA_MESH_NUMBER_OF_TOTAL_VERTICIES = 1276;
enum OrbisCameraChannel { enum OrbisCameraChannel {
ORBIS_CAMERA_CHANNEL_0 = 1, ORBIS_CAMERA_CHANNEL_0 = 1,
@@ -73,6 +74,11 @@ enum OrbisCameraScaleFormat {
ORBIS_CAMERA_SCALE_FORMAT_UNKNOWN = 0xFF, ORBIS_CAMERA_SCALE_FORMAT_UNKNOWN = 0xFF,
}; };
enum OrbisCameraCalibrationDataFunctionType {
ORBIS_CAMERA_CALIBRATION_DATA_FUNCTION_TYPE_IMAGE_RECTIFICATION = 0,
ORBIS_CAMERA_CALIBRATION_DATA_FUNCTION_TYPE_IMAGE_INVERSE_RECTIFICATION = 1,
};
struct OrbisCameraFormat { struct OrbisCameraFormat {
OrbisCameraBaseFormat formatLevel0; OrbisCameraBaseFormat formatLevel0;
OrbisCameraScaleFormat formatLevel1; OrbisCameraScaleFormat formatLevel1;
@@ -206,103 +212,131 @@ struct OrbisCameraAttribute {
u32 reserved4; u32 reserved4;
}; };
struct OrbisCameraGetCalibrationDataParameter {
u32 size;
u32 format_type;
OrbisCameraCalibrationDataFunctionType function_type;
};
struct OrbisCameraCalibrationDataElement {
u32 total_horizontal_verticies;
u32 total_vertical_verticies;
u32 left_margin;
u32 right_margin;
u32 top_margin;
u32 bottom_margin;
float x_table[ORBIS_CAMERA_CALIBRATION_DATA_MESH_NUMBER_OF_TOTAL_VERTICIES];
float y_table[ORBIS_CAMERA_CALIBRATION_DATA_MESH_NUMBER_OF_TOTAL_VERTICIES];
};
struct OrbisCameraCalibrationData {
u32 format_type;
OrbisCameraCalibrationDataFunctionType function_type;
OrbisCameraCalibrationDataElement data[2];
};
s32 PS4_SYSV_ABI sceCameraAccGetData(); s32 PS4_SYSV_ABI sceCameraAccGetData();
s32 PS4_SYSV_ABI sceCameraAudioClose(); s32 PS4_SYSV_ABI sceCameraAudioClose();
s32 PS4_SYSV_ABI sceCameraAudioGetData(); s32 PS4_SYSV_ABI sceCameraAudioGetData(void* data);
s32 PS4_SYSV_ABI sceCameraAudioGetData2(); s32 PS4_SYSV_ABI sceCameraAudioGetData2(void* data);
s32 PS4_SYSV_ABI sceCameraAudioOpen(); s32 PS4_SYSV_ABI sceCameraAudioOpen();
s32 PS4_SYSV_ABI sceCameraAudioReset(); s32 PS4_SYSV_ABI sceCameraAudioReset();
s32 PS4_SYSV_ABI sceCameraChangeAppModuleState(); s32 PS4_SYSV_ABI sceCameraChangeAppModuleState();
s32 PS4_SYSV_ABI sceCameraClose(s32 handle); s32 PS4_SYSV_ABI sceCameraClose(s32 handle);
s32 PS4_SYSV_ABI sceCameraCloseByHandle(); s32 PS4_SYSV_ABI sceCameraCloseByHandle(s32 handle);
s32 PS4_SYSV_ABI sceCameraDeviceOpen(); s32 PS4_SYSV_ABI sceCameraDeviceOpen();
s32 PS4_SYSV_ABI sceCameraGetAttribute(s32 handle, OrbisCameraAttribute* pAttribute); s32 PS4_SYSV_ABI sceCameraGetAttribute(s32 handle, OrbisCameraAttribute* attribute);
s32 PS4_SYSV_ABI sceCameraGetAutoExposureGain(s32 handle, OrbisCameraChannel channel, u32* pEnable, s32 PS4_SYSV_ABI sceCameraGetAutoExposureGain(s32 handle, OrbisCameraChannel channel, u32* enable,
void* pOption); OrbisCameraAutoExposureGainTarget* option);
s32 PS4_SYSV_ABI sceCameraGetAutoWhiteBalance(s32 handle, OrbisCameraChannel channel, u32* pEnable, s32 PS4_SYSV_ABI sceCameraGetAutoWhiteBalance(s32 handle, OrbisCameraChannel channel, u32* enable,
void* pOption); void* option);
s32 PS4_SYSV_ABI sceCameraGetCalibData(); s32 PS4_SYSV_ABI sceCameraGetCalibData();
s32 PS4_SYSV_ABI sceCameraGetCalibDataFromDevice(); s32 PS4_SYSV_ABI sceCameraGetCalibDataFromDevice();
s32 PS4_SYSV_ABI sceCameraGetCalibrationData(); s32 PS4_SYSV_ABI sceCameraGetCalibrationData(const OrbisCameraGetCalibrationDataParameter* param,
s32 PS4_SYSV_ABI sceCameraGetConfig(s32 handle, OrbisCameraConfig* pConfig); OrbisCameraCalibrationData* calibration_data);
s32 PS4_SYSV_ABI sceCameraGetContrast(s32 handle, OrbisCameraChannel channel, u32* pContrast, s32 PS4_SYSV_ABI sceCameraGetConfig(s32 handle, OrbisCameraConfig* config);
void* pOption); s32 PS4_SYSV_ABI sceCameraGetContrast(s32 handle, OrbisCameraChannel channel, u32* contrast,
void* option);
s32 PS4_SYSV_ABI sceCameraGetDefectivePixelCancellation(s32 handle, OrbisCameraChannel channel, s32 PS4_SYSV_ABI sceCameraGetDefectivePixelCancellation(s32 handle, OrbisCameraChannel channel,
u32* pEnable, void* pOption); u32* enable, void* option);
s32 PS4_SYSV_ABI sceCameraGetDeviceConfig(); s32 PS4_SYSV_ABI sceCameraGetDeviceConfig(s32 handle, OrbisCameraConfig* config);
s32 PS4_SYSV_ABI sceCameraGetDeviceConfigWithoutHandle(); s32 PS4_SYSV_ABI sceCameraGetDeviceConfigWithoutHandle(OrbisCameraConfig* config);
s32 PS4_SYSV_ABI sceCameraGetDeviceID(); s32 PS4_SYSV_ABI sceCameraGetDeviceID();
s32 PS4_SYSV_ABI sceCameraGetDeviceIDWithoutOpen(); s32 PS4_SYSV_ABI sceCameraGetDeviceIDWithoutOpen();
s32 PS4_SYSV_ABI sceCameraGetDeviceInfo(s32 reserved, OrbisCameraDeviceInfo* pDeviceInfo); s32 PS4_SYSV_ABI sceCameraGetDeviceInfo(s32 reserved, OrbisCameraDeviceInfo* device_info);
s32 PS4_SYSV_ABI sceCameraGetExposureGain(s32 handle, OrbisCameraChannel channel, s32 PS4_SYSV_ABI sceCameraGetExposureGain(s32 handle, OrbisCameraChannel channel,
OrbisCameraExposureGain* pExposureGain, void* pOption); OrbisCameraExposureGain* exposure_gain, void* option);
s32 PS4_SYSV_ABI sceCameraGetFrameData(int handle, OrbisCameraFrameData* pFrameData); s32 PS4_SYSV_ABI sceCameraGetFrameData(s32 handle, OrbisCameraFrameData* frame_data);
s32 PS4_SYSV_ABI sceCameraGetGamma(s32 handle, OrbisCameraChannel channel, OrbisCameraGamma* pGamma, s32 PS4_SYSV_ABI sceCameraGetGamma(s32 handle, OrbisCameraChannel channel, OrbisCameraGamma* gamma,
void* pOption); void* option);
s32 PS4_SYSV_ABI sceCameraGetHue(s32 handle, OrbisCameraChannel channel, s32* pHue, void* pOption); s32 PS4_SYSV_ABI sceCameraGetHue(s32 handle, OrbisCameraChannel channel, s32* hue, void* option);
s32 PS4_SYSV_ABI sceCameraGetLensCorrection(s32 handle, OrbisCameraChannel channel, u32* pEnable, s32 PS4_SYSV_ABI sceCameraGetLensCorrection(s32 handle, OrbisCameraChannel channel, u32* enable,
void* pOption); void* option);
s32 PS4_SYSV_ABI sceCameraGetMmapConnectedCount(); s32 PS4_SYSV_ABI sceCameraGetMmapConnectedCount(u32* count);
s32 PS4_SYSV_ABI sceCameraGetProductInfo(); s32 PS4_SYSV_ABI sceCameraGetProductInfo(void* product_info);
s32 PS4_SYSV_ABI sceCameraGetRegister(); s32 PS4_SYSV_ABI sceCameraGetRegister();
s32 PS4_SYSV_ABI sceCameraGetRegistryInfo(); s32 PS4_SYSV_ABI sceCameraGetRegistryInfo(void* registry_info);
s32 PS4_SYSV_ABI sceCameraGetSaturation(s32 handle, OrbisCameraChannel channel, u32* pSaturation, s32 PS4_SYSV_ABI sceCameraGetSaturation(s32 handle, OrbisCameraChannel channel, u32* saturation,
void* pOption); void* option);
s32 PS4_SYSV_ABI sceCameraGetSharpness(s32 handle, OrbisCameraChannel channel, u32* pSharpness, s32 PS4_SYSV_ABI sceCameraGetSharpness(s32 handle, OrbisCameraChannel channel, u32* sharpness,
void* pOption); void* option);
s32 PS4_SYSV_ABI sceCameraGetVrCaptureInfo(); s32 PS4_SYSV_ABI sceCameraGetVrCaptureInfo();
s32 PS4_SYSV_ABI sceCameraGetWhiteBalance(s32 handle, OrbisCameraChannel channel, s32 PS4_SYSV_ABI sceCameraGetWhiteBalance(s32 handle, OrbisCameraChannel channel,
OrbisCameraWhiteBalance* pWhiteBalance, void* pOption); OrbisCameraWhiteBalance* white_balance, void* option);
s32 PS4_SYSV_ABI sceCameraInitializeRegistryCalibData(); s32 PS4_SYSV_ABI sceCameraInitializeRegistryCalibData();
s32 PS4_SYSV_ABI sceCameraIsAttached(s32 index); s32 PS4_SYSV_ABI sceCameraIsAttached(s32 index);
s32 PS4_SYSV_ABI sceCameraIsConfigChangeDone(); s32 PS4_SYSV_ABI sceCameraIsConfigChangeDone();
s32 PS4_SYSV_ABI sceCameraIsValidFrameData(int handle, OrbisCameraFrameData* pFrameData); s32 PS4_SYSV_ABI sceCameraIsValidFrameData(s32 handle, OrbisCameraFrameData* frame_data);
s32 PS4_SYSV_ABI sceCameraOpen(Libraries::UserService::OrbisUserServiceUserId userId, s32 type, s32 PS4_SYSV_ABI sceCameraOpen(Libraries::UserService::OrbisUserServiceUserId user_id, s32 type,
s32 index, OrbisCameraOpenParameter* pParam); s32 index, OrbisCameraOpenParameter* param);
s32 PS4_SYSV_ABI sceCameraOpenByModuleId(); s32 PS4_SYSV_ABI sceCameraOpenByModuleId();
s32 PS4_SYSV_ABI sceCameraRemoveAppModuleFocus(); s32 PS4_SYSV_ABI sceCameraRemoveAppModuleFocus();
s32 PS4_SYSV_ABI sceCameraSetAppModuleFocus(); s32 PS4_SYSV_ABI sceCameraSetAppModuleFocus();
s32 PS4_SYSV_ABI sceCameraSetAttribute(s32 handle, OrbisCameraAttribute* pAttribute); s32 PS4_SYSV_ABI sceCameraSetAttribute(s32 handle, OrbisCameraAttribute* attribute);
s32 PS4_SYSV_ABI sceCameraSetAttributeInternal(); s32 PS4_SYSV_ABI sceCameraSetAttributeInternal();
s32 PS4_SYSV_ABI sceCameraSetAutoExposureGain(s32 handle, OrbisCameraChannel channel, u32 enable, s32 PS4_SYSV_ABI sceCameraSetAutoExposureGain(s32 handle, OrbisCameraChannel channel, u32 enable,
void* pOption); OrbisCameraAutoExposureGainTarget* option);
s32 PS4_SYSV_ABI sceCameraSetAutoWhiteBalance(s32 handle, OrbisCameraChannel channel, u32 enable, s32 PS4_SYSV_ABI sceCameraSetAutoWhiteBalance(s32 handle, OrbisCameraChannel channel, u32 enable,
void* pOption); void* option);
s32 PS4_SYSV_ABI sceCameraSetCalibData(); s32 PS4_SYSV_ABI sceCameraSetCalibData();
s32 PS4_SYSV_ABI sceCameraSetConfig(s32 handle, OrbisCameraConfig* pConfig); s32 PS4_SYSV_ABI sceCameraSetConfig(s32 handle, OrbisCameraConfig* config);
s32 PS4_SYSV_ABI sceCameraSetConfigInternal(); s32 PS4_SYSV_ABI sceCameraSetConfigInternal(s32 handle, OrbisCameraConfig* config);
s32 PS4_SYSV_ABI sceCameraSetContrast(s32 handle, OrbisCameraChannel channel, u32 contrast, s32 PS4_SYSV_ABI sceCameraSetContrast(s32 handle, OrbisCameraChannel channel, u32 contrast,
void* pOption); void* option);
s32 PS4_SYSV_ABI sceCameraSetDebugStop(); s32 PS4_SYSV_ABI sceCameraSetDebugStop(u32 debug_stop_enable);
s32 PS4_SYSV_ABI sceCameraSetDefectivePixelCancellation(s32 handle, OrbisCameraChannel channel, s32 PS4_SYSV_ABI sceCameraSetDefectivePixelCancellation(s32 handle, OrbisCameraChannel channel,
u32 enable, void* pOption); u32 enable, void* option);
s32 PS4_SYSV_ABI sceCameraSetDefectivePixelCancellationInternal(); s32 PS4_SYSV_ABI sceCameraSetDefectivePixelCancellationInternal(s32 handle,
OrbisCameraChannel channel,
u32 enable, void* option);
s32 PS4_SYSV_ABI sceCameraSetExposureGain(s32 handle, OrbisCameraChannel channel, s32 PS4_SYSV_ABI sceCameraSetExposureGain(s32 handle, OrbisCameraChannel channel,
OrbisCameraExposureGain* pExposureGain, void* pOption); OrbisCameraExposureGain* exposure_gain, void* option);
s32 PS4_SYSV_ABI sceCameraSetForceActivate(); s32 PS4_SYSV_ABI sceCameraSetForceActivate();
s32 PS4_SYSV_ABI sceCameraSetGamma(s32 handle, OrbisCameraChannel channel, OrbisCameraGamma* pGamma, s32 PS4_SYSV_ABI sceCameraSetGamma(s32 handle, OrbisCameraChannel channel, OrbisCameraGamma* gamma,
void* pOption); void* option);
s32 PS4_SYSV_ABI sceCameraSetHue(s32 handle, OrbisCameraChannel channel, s32 hue, void* pOption); s32 PS4_SYSV_ABI sceCameraSetHue(s32 handle, OrbisCameraChannel channel, s32 hue, void* option);
s32 PS4_SYSV_ABI sceCameraSetLensCorrection(s32 handle, OrbisCameraChannel channel, u32 enable, s32 PS4_SYSV_ABI sceCameraSetLensCorrection(s32 handle, OrbisCameraChannel channel, u32 enable,
void* pOption); void* option);
s32 PS4_SYSV_ABI sceCameraSetLensCorrectionInternal(); s32 PS4_SYSV_ABI sceCameraSetLensCorrectionInternal(s32 handle, OrbisCameraChannel channel,
u32 enable, void* option);
s32 PS4_SYSV_ABI sceCameraSetProcessFocus(); s32 PS4_SYSV_ABI sceCameraSetProcessFocus();
s32 PS4_SYSV_ABI sceCameraSetProcessFocusByHandle(); s32 PS4_SYSV_ABI sceCameraSetProcessFocusByHandle();
s32 PS4_SYSV_ABI sceCameraSetRegister(); s32 PS4_SYSV_ABI sceCameraSetRegister();
s32 PS4_SYSV_ABI sceCameraSetSaturation(s32 handle, OrbisCameraChannel channel, u32 saturation, s32 PS4_SYSV_ABI sceCameraSetSaturation(s32 handle, OrbisCameraChannel channel, u32 saturation,
void* pOption); void* option);
s32 PS4_SYSV_ABI sceCameraSetSharpness(s32 handle, OrbisCameraChannel channel, u32 sharpness, s32 PS4_SYSV_ABI sceCameraSetSharpness(s32 handle, OrbisCameraChannel channel, u32 sharpness,
void* pOption); void* option);
s32 PS4_SYSV_ABI sceCameraSetTrackerMode(); s32 PS4_SYSV_ABI sceCameraSetTrackerMode();
s32 PS4_SYSV_ABI sceCameraSetUacModeInternal(); s32 PS4_SYSV_ABI sceCameraSetUacModeInternal();
s32 PS4_SYSV_ABI sceCameraSetVideoSync(s32 handle, OrbisCameraVideoSyncParameter* pVideoSync); s32 PS4_SYSV_ABI sceCameraSetVideoSync(s32 handle, OrbisCameraVideoSyncParameter* video_sync);
s32 PS4_SYSV_ABI sceCameraSetVideoSyncInternal(); s32 PS4_SYSV_ABI sceCameraSetVideoSyncInternal(s32 handle,
OrbisCameraVideoSyncParameter* video_sync);
s32 PS4_SYSV_ABI sceCameraSetWhiteBalance(s32 handle, OrbisCameraChannel channel, s32 PS4_SYSV_ABI sceCameraSetWhiteBalance(s32 handle, OrbisCameraChannel channel,
OrbisCameraWhiteBalance* pWhiteBalance, void* pOption); OrbisCameraWhiteBalance* white_balance, void* option);
s32 PS4_SYSV_ABI sceCameraStart(s32 handle, OrbisCameraStartParameter* pParam); s32 PS4_SYSV_ABI sceCameraStart(s32 handle, OrbisCameraStartParameter* param);
s32 PS4_SYSV_ABI sceCameraStartByHandle(); s32 PS4_SYSV_ABI sceCameraStartByHandle(s32 handle, OrbisCameraStartParameter* param);
s32 PS4_SYSV_ABI sceCameraStop(s32 handle); s32 PS4_SYSV_ABI sceCameraStop(s32 handle);
s32 PS4_SYSV_ABI sceCameraStopByHandle(); s32 PS4_SYSV_ABI sceCameraStopByHandle(s32 handle);
void RegisterLib(Core::Loader::SymbolsResolver* sym); void RegisterLib(Core::Loader::SymbolsResolver* sym);
} // namespace Libraries::Camera } // namespace Libraries::Camera