diff --git a/README.md b/README.md index bf2774d..70a0c58 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,9 @@ the fps remains at 30. # Installation gpu screen recorder can be built using [sibs](https://github.com/DEC05EBA/sibs) or if you are running Arch Linux, then you can find it on aur under the name gpu-screen-recorder-git (`yay -S gpu-screen-recorder-git`). -# Example -Run `interactive.sh` or run `gpu-screen-recorder -w 0x1c00001 -c mp4 -f 60 -a bluez_sink.00_18_09_8A_07_93.a2dp_sink.monitor > test_video.mp4` +# How to use +Run `interactive.sh` or run gpu-screen-recorder directly, for example: `gpu-screen-recorder -w 0x1c00001 -c mp4 -f 60 -a bluez_sink.00_18_09_8A_07_93.a2dp_sink.monitor > test_video.mp4`\ +Then stop the screen recorder with Ctrl+C. # Demo [![Click here to watch a demo video on youtube](https://img.youtube.com/vi/n5tm0g01n6A/0.jpg)](https://www.youtube.com/watch?v=n5tm0g01n6A) @@ -34,4 +35,4 @@ FFMPEG only uses the GPU with CUDA when doing transcoding from an input video to * Support AMD and Intel, using VAAPI. cuda and vaapi should be loaded at runtime using dlopen instead of linking to those libraries at compile-time. * Clean up the code! -* Fix segfault in debug mode \ No newline at end of file +* Fix segfault in debug mode diff --git a/src/main.cpp b/src/main.cpp index 534a619..eafbc24 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -529,7 +530,15 @@ static void usage() { exit(1); } +static sig_atomic_t running = 1; + +static void int_handler(int dummy) { + running = 0; +} + int main(int argc, char **argv) { + signal(SIGINT, int_handler); + std::map args = { { "-w", "" }, { "-c", "" }, @@ -606,8 +615,7 @@ int main(int argc, char **argv) { glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); - GLFWwindow *window = - glfwCreateWindow(1280, 720, "Hello world", nullptr, nullptr); + GLFWwindow *window = glfwCreateWindow(32, 32, "gpu-screen-recorder", nullptr, nullptr); if (!window) { fprintf(stderr, "Error: Failed to create glfw window\n"); glfwTerminate(); @@ -616,6 +624,7 @@ int main(int argc, char **argv) { glfwMakeContextCurrent(window); glfwSwapInterval(0); + glfwHideWindow(window); #if defined(DEBUG) XSetErrorHandler(x11_error_handler); @@ -784,8 +793,7 @@ int main(int argc, char **argv) { std::mutex write_output_mutex; - bool running = true; - std::thread audio_thread([&running](AVFormatContext *av_format_context, AVStream *audio_stream, AVPacket *audio_packet, uint8_t *audio_frame_buf, SoundDevice *sound_device, AVFrame *audio_frame, std::mutex *write_output_mutex) mutable { + std::thread audio_thread([](AVFormatContext *av_format_context, AVStream *audio_stream, AVPacket *audio_packet, uint8_t *audio_frame_buf, SoundDevice *sound_device, AVFrame *audio_frame, std::mutex *write_output_mutex) mutable { SwrContext *swr = swr_alloc(); if(!swr) { fprintf(stderr, "Failed to create SwrContext\n"); @@ -834,7 +842,7 @@ int main(int argc, char **argv) { bool redraw = true; XEvent e; - while (!glfwWindowShouldClose(window)) { + while (running) { double frame_start = glfwGetTime(); glClear(GL_COLOR_BUFFER_BIT); @@ -962,7 +970,7 @@ int main(int argc, char **argv) { usleep(sleep_time * 1000.0 * 1000.0); } - running = false; + running = 0; audio_thread.join(); sound_device_close(&sound_device);