diff --git a/sunshine/input.cpp b/sunshine/input.cpp index 6b63e904..260bc288 100644 --- a/sunshine/input.cpp +++ b/sunshine/input.cpp @@ -115,12 +115,16 @@ void print(void *input) { } void passthrough(platf::input_t &input, PNV_MOUSE_MOVE_PACKET packet) { + display_cursor = true; + platf::move_mouse(input, util::endian::big(packet->deltaX), util::endian::big(packet->deltaY)); } void passthrough(platf::input_t &input, PNV_MOUSE_BUTTON_PACKET packet) { auto constexpr BUTTON_RELEASED = 0x09; + display_cursor = true; + platf::button_mouse(input, util::endian::big(packet->button), packet->action == BUTTON_RELEASED); } @@ -131,10 +135,14 @@ void passthrough(platf::input_t &input, PNV_KEYBOARD_PACKET packet) { } void passthrough(platf::input_t &input, PNV_SCROLL_PACKET packet) { + display_cursor = true; + platf::scroll(input, util::endian::big(packet->scrollAmt1)); } void passthrough(std::shared_ptr &input, PNV_MULTI_CONTROLLER_PACKET packet) { + display_cursor = false; + std::uint16_t bf; std::memcpy(&bf, &packet->buttonFlags, sizeof(std::uint16_t)); diff --git a/sunshine/main.cpp b/sunshine/main.cpp index d6bff9f9..aa30edbe 100644 --- a/sunshine/main.cpp +++ b/sunshine/main.cpp @@ -19,6 +19,8 @@ extern "C" { using namespace std::literals; util::ThreadPool task_pool; +bool display_cursor; + int main(int argc, char *argv[]) { if(argc > 1) { if(!std::filesystem::exists(argv[1])) { diff --git a/sunshine/main.h b/sunshine/main.h index 1a7bd309..3564b781 100644 --- a/sunshine/main.h +++ b/sunshine/main.h @@ -8,5 +8,6 @@ #include "thread_pool.h" extern util::ThreadPool task_pool; +extern bool display_cursor; #endif //SUNSHINE_MAIN_H diff --git a/sunshine/platform/common.h b/sunshine/platform/common.h index e8446aa8..187a01e7 100644 --- a/sunshine/platform/common.h +++ b/sunshine/platform/common.h @@ -22,16 +22,6 @@ using mic_t = util::safe_ptr; using audio_t = util::safe_ptr; using input_t = util::safe_ptr; -struct gamepad_state_t { - std::uint16_t buttonFlags; - std::uint8_t lt; - std::uint8_t rt; - std::int16_t lsX; - std::int16_t lsY; - std::int16_t rsX; - std::int16_t rsY; -}; - std::string get_local_ip(); void terminate_process(std::uint64_t handle); @@ -40,7 +30,7 @@ mic_t microphone(); audio_t audio(mic_t &mic, std::uint32_t sample_size); display_t display(); -img_t snapshot(display_t &display); +img_t snapshot(display_t &display_void, bool cursor); int32_t img_width(img_t &); int32_t img_height(img_t &); diff --git a/sunshine/platform/linux.cpp b/sunshine/platform/linux.cpp index 7a638c28..10474d61 100644 --- a/sunshine/platform/linux.cpp +++ b/sunshine/platform/linux.cpp @@ -115,7 +115,7 @@ display_t display() { return display_t { new display_attr_t {} }; } -img_t snapshot(display_t &display_void) { +img_t snapshot(display_t &display_void, bool cursor) { auto &display = *((display_attr_t*)display_void.get()); display.refresh(); @@ -127,6 +127,10 @@ img_t snapshot(display_t &display_void) { AllPlanes, ZPixmap) }; + if(!cursor) { + return img_t { img }; + } + XFixesCursorImage *overlay = XFixesGetCursorImage(display.display); overlay->x -= overlay->xhot; overlay->y -= overlay->yhot; diff --git a/sunshine/platform/linux_evdev.cpp b/sunshine/platform/linux_evdev.cpp index 1955f11d..2b2ba78c 100644 --- a/sunshine/platform/linux_evdev.cpp +++ b/sunshine/platform/linux_evdev.cpp @@ -26,11 +26,9 @@ struct input_raw_t { uinput_t mouse_input; display_t display; - - gamepad_state_t gamepad_state; }; -//TODO: Use libevdev for keyboard and mouse, then any mention of X11 can be removed from linux_input.cpp +//TODO: Use libevdev for keyboard and mouse, then any mention of X11 can be removed from linux_evdev.cpp struct display_attr_t { display_attr_t() : display { XOpenDisplay(nullptr) }, window { DefaultRootWindow(display) }, attr {} { XGetWindowAttributes(display, window, &attr); diff --git a/sunshine/video.cpp b/sunshine/video.cpp index 2cd94e1f..4f1dd1f0 100644 --- a/sunshine/video.cpp +++ b/sunshine/video.cpp @@ -6,15 +6,15 @@ #include #include -#include "platform/common.h" - extern "C" { #include #include } +#include "platform/common.h" #include "config.h" #include "video.h" +#include "main.h" namespace video { using namespace std::literals; @@ -121,9 +121,11 @@ void encodeThread( ctx->rc_min_rate = config.bitrate; } else if(config::video.crf != 0) { + ctx->gop_size = config::video.gop_size; av_dict_set_int(&options, "crf", config::video.crf, 0); } else { + ctx->gop_size = config::video.gop_size; av_dict_set_int(&options, "qp", config::video.qp, 0); } @@ -169,8 +171,6 @@ void encodeThread( TUPLE_2D_REF(start, end, *event); frame = start; - - // For some reason, the encoder does not always accept the key_frame when using "end + 1" key_frame = end + 2; } else if(frame == key_frame) { @@ -184,6 +184,8 @@ void encodeThread( } void capture_display(packet_queue_t packets, idr_event_t idr_events, config_t config) { + display_cursor = true; + int framerate = config.framerate; img_event_t images {new img_event_t::element_type }; @@ -195,7 +197,7 @@ void capture_display(packet_queue_t packets, idr_event_t idr_events, config_t co auto time_span = std::chrono::floor(1s) / framerate; while(packets->running()) { auto next_snapshot = std::chrono::steady_clock::now() + time_span; - auto img = platf::snapshot(disp); + auto img = platf::snapshot(disp, display_cursor); images->raise(std::move(img)); img.reset();