Skip to content

Commit 1d7700b

Browse files
committed
Add SDL camera handler
1 parent ec5b2bc commit 1d7700b

30 files changed

+1784
-460
lines changed

rpcs3/CMakeLists.txt

+4
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ if (NOT ANDROID)
7979

8080
Input/basic_keyboard_handler.cpp
8181
Input/basic_mouse_handler.cpp
82+
Input/camera_video_sink.cpp
8283
Input/ds3_pad_handler.cpp
8384
Input/ds4_pad_handler.cpp
8485
Input/dualsense_pad_handler.cpp
@@ -96,6 +97,9 @@ if (NOT ANDROID)
9697
Input/ps_move_tracker.cpp
9798
Input/raw_mouse_config.cpp
9899
Input/raw_mouse_handler.cpp
100+
Input/sdl_camera_handler.cpp
101+
Input/sdl_camera_video_sink.cpp
102+
Input/sdl_instance.cpp
99103
Input/sdl_pad_handler.cpp
100104
Input/skateboard_pad_handler.cpp
101105
Input/xinput_pad_handler.cpp

rpcs3/Emu/Cell/Modules/cellGem.cpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -1331,8 +1331,15 @@ void gem_config_data::operator()()
13311331
vc = vc_attribute;
13321332
}
13331333

1334-
if (g_cfg.io.camera != camera_handler::qt)
1334+
switch (g_cfg.io.camera)
13351335
{
1336+
#ifdef HAVE_SDL3
1337+
case camera_handler::sdl:
1338+
#endif
1339+
case camera_handler::qt:
1340+
break;
1341+
case camera_handler::fake:
1342+
case camera_handler::null:
13361343
video_conversion_in_progress = false;
13371344
done();
13381345
continue;

rpcs3/Emu/Io/camera_config.cpp

+16-8
Original file line numberDiff line numberDiff line change
@@ -36,32 +36,38 @@ void cfg_camera::save() const
3636
}
3737
}
3838

39-
cfg_camera::camera_setting cfg_camera::get_camera_setting(const std::string& camera, bool& success)
39+
cfg_camera::camera_setting cfg_camera::get_camera_setting(const std::string& handler, const std::string& camera, bool& success)
4040
{
41-
camera_setting setting;
42-
const std::string value = cameras.get_value(camera);
41+
camera_setting setting {};
42+
const std::string value = cameras.get_value(handler + "-" + camera);
4343
success = !value.empty();
4444
if (success)
4545
{
46-
setting.from_string(cameras.get_value(camera));
46+
setting.from_string(value);
4747
}
4848
return setting;
4949
}
5050

51-
void cfg_camera::set_camera_setting(const std::string& camera, const camera_setting& setting)
51+
void cfg_camera::set_camera_setting(const std::string& handler, const std::string& camera, const camera_setting& setting)
5252
{
53+
if (handler.empty())
54+
{
55+
camera_log.error("String '%s' cannot be used as handler key.", handler);
56+
return;
57+
}
58+
5359
if (camera.empty())
5460
{
5561
camera_log.error("String '%s' cannot be used as camera key.", camera);
5662
return;
5763
}
5864

59-
cameras.set_value(camera, setting.to_string());
65+
cameras.set_value(handler + "-" + camera, setting.to_string());
6066
}
6167

6268
std::string cfg_camera::camera_setting::to_string() const
6369
{
64-
return fmt::format("%d,%d,%f,%f,%d", width, height, min_fps, max_fps, format);
70+
return fmt::format("%d,%d,%f,%f,%d,%d", width, height, min_fps, max_fps, format, colorspace);
6571
}
6672

6773
void cfg_camera::camera_setting::from_string(const std::string& text)
@@ -106,12 +112,14 @@ void cfg_camera::camera_setting::from_string(const std::string& text)
106112
!to_integer(::at32(list, 1), height) ||
107113
!to_double(::at32(list, 2), min_fps) ||
108114
!to_double(::at32(list, 3), max_fps) ||
109-
!to_integer(::at32(list, 4), format))
115+
!to_integer(::at32(list, 4), format) ||
116+
!to_integer(::at32(list, 4), colorspace))
110117
{
111118
width = 0;
112119
height = 0;
113120
min_fps = 0;
114121
max_fps = 0;
115122
format = 0;
123+
colorspace = 0;
116124
}
117125
}

rpcs3/Emu/Io/camera_config.h

+5-4
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,19 @@ struct cfg_camera final : cfg::node
1515
double min_fps = 0;
1616
double max_fps = 0;
1717
int format = 0;
18+
int colorspace = 0;
1819

19-
static constexpr u32 member_count = 5;
20+
static constexpr u32 member_count = 6;
2021

2122
std::string to_string() const;
2223
void from_string(const std::string& text);
2324
};
24-
camera_setting get_camera_setting(const std::string& camera, bool& success);
25-
void set_camera_setting(const std::string& camera, const camera_setting& setting);
25+
camera_setting get_camera_setting(const std::string& handler, const std::string& camera, bool& success);
26+
void set_camera_setting(const std::string& handler, const std::string& camera, const camera_setting& setting);
2627

2728
const std::string path;
2829

29-
cfg::map_entry cameras{ this, "Cameras" }; // <camera>: <width>,<height>,<min_fps>,<max_fps>,<format>
30+
cfg::map_entry cameras{ this, "Cameras" }; // <handler-camera>: <width>,<height>,<min_fps>,<max_fps>,<format>,<colorspace>
3031
};
3132

3233
extern cfg_camera g_cfg_camera;

rpcs3/Emu/RSX/Overlays/HomeMenu/overlay_home_menu_settings.cpp

+9-1
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,17 @@ namespace rsx
7575
add_checkbox(&g_cfg.io.keep_pads_connected, localized_string_id::HOME_MENU_SETTINGS_INPUT_KEEP_PADS_CONNECTED);
7676
add_checkbox(&g_cfg.io.show_move_cursor, localized_string_id::HOME_MENU_SETTINGS_INPUT_SHOW_PS_MOVE_CURSOR);
7777

78-
if (g_cfg.io.camera == camera_handler::qt)
78+
switch (g_cfg.io.camera)
7979
{
80+
#ifdef HAVE_SDL3
81+
case camera_handler::sdl:
82+
#endif
83+
case camera_handler::qt:
8084
add_dropdown(&g_cfg.io.camera_flip_option, localized_string_id::HOME_MENU_SETTINGS_INPUT_CAMERA_FLIP);
85+
break;
86+
case camera_handler::fake:
87+
case camera_handler::null:
88+
break;
8189
}
8290

8391
add_dropdown(&g_cfg.io.pad_mode, localized_string_id::HOME_MENU_SETTINGS_INPUT_PAD_MODE);

rpcs3/Emu/system_config.h

+1
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,7 @@ struct cfg_root : cfg::node
269269
cfg::_enum<fake_camera_type> camera_type{ this, "Camera type", fake_camera_type::unknown };
270270
cfg::_enum<camera_flip> camera_flip_option{ this, "Camera flip", camera_flip::none, true };
271271
cfg::string camera_id{ this, "Camera ID", "Default", true };
272+
cfg::string sdl_camera_id{ this, "SDL Camera ID", "Default", true };
272273
cfg::_enum<move_handler> move{ this, "Move", move_handler::null, true };
273274
cfg::_enum<buzz_handler> buzz{ this, "Buzz emulated controller", buzz_handler::null };
274275
cfg::_enum<turntable_handler> turntable{this, "Turntable emulated controller", turntable_handler::null};

rpcs3/Emu/system_config_types.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,9 @@ void fmt_class_string<camera_handler>::format(std::string& out, u64 arg)
374374
case camera_handler::null: return "Null";
375375
case camera_handler::fake: return "Fake";
376376
case camera_handler::qt: return "Qt";
377+
#ifdef HAVE_SDL3
378+
case camera_handler::sdl: return "SDL";
379+
#endif
377380
}
378381

379382
return unknown;

rpcs3/Emu/system_config_types.h

+4-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,10 @@ enum class camera_handler
116116
{
117117
null,
118118
fake,
119-
qt
119+
qt,
120+
#ifdef HAVE_SDL3
121+
sdl,
122+
#endif
120123
};
121124

122125
enum class camera_flip

0 commit comments

Comments
 (0)