Exit with exit code 10 if pkexec fails

This commit is contained in:
dec05eba 2023-07-22 23:12:08 +02:00
parent 9ca5b8ec3a
commit d45597e104
7 changed files with 24 additions and 11 deletions

View File

@ -6,8 +6,8 @@ This screen recorder can be used for recording your desktop offline, for live st
where only the last few seconds are saved.
## Note
This software works with x11 and wayland, but when using wayland only monitors can be recorded and root access is needed.\
If you are using a variable refresh rate monitor then choose to record "screen-direct-force". This will allow variable refresh rate to work when recording fullscreen applications. Note that some applications such as mpv will not work in fullscreen mode. A fix is being developed for this.\
This software works with x11 and wayland, but when using wayland only monitors can be recorded and root access is required.\
If you are using a variable refresh rate monitor on nvidia on x11 then choose to record "screen-direct-force". This will allow variable refresh rate to work when recording fullscreen applications. Note that some applications such as mpv will not work in fullscreen mode. A fix is being developed for this.\
GPU Screen Recorder only supports h264 and hevc codecs at the moment which means that webm files are not supported.
### TEMPORARY ISSUES
1) screen-direct capture has been temporary disabled as it causes issues with stuttering. This might be a nvfbc bug.

View File

@ -140,6 +140,7 @@ static bool find_program_in_path(const char *program_name, char *filepath, int f
}
int gsr_kms_client_init(gsr_kms_client *self, const char *card_path) {
int result = -1;
self->kms_server_pid = -1;
self->socket_fd = -1;
self->client_fd = -1;
@ -248,12 +249,19 @@ int gsr_kms_client_init(gsr_kms_client *self, const char *card_path) {
}
break;
} else {
int status;
int status = 0;
int wait_result = waitpid(self->kms_server_pid, &status, WNOHANG);
if(wait_result != 0) {
fprintf(stderr, "gsr error: gsr_kms_client_init: kms server died or never started, error: %s\n", strerror(errno));
self->kms_server_pid = -1;
goto err;
} else if(WIFEXITED(status)) {
int exit_code = WEXITSTATUS(status);
fprintf(stderr, "gsr error: gsr_kms_client_init: kms server died or never started, exit code: %d\n", exit_code);
self->kms_server_pid = -1;
if(exit_code != 0)
result = exit_code;
goto err;
}
}
}
@ -263,7 +271,7 @@ int gsr_kms_client_init(gsr_kms_client *self, const char *card_path) {
err:
gsr_kms_client_deinit(self);
return -1;
return result;
}
void gsr_kms_client_deinit(gsr_kms_client *self) {

View File

@ -338,7 +338,7 @@ int main(int argc, char **argv) {
if(drmSetClientCap(drm.drmfd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1) != 0) {
fprintf(stderr, "kms server error: drmSetClientCap DRM_CLIENT_CAP_UNIVERSAL_PLANES failed, error: %s\n", strerror(errno));
close(drm.drmfd);
return 2;
return 10;
}
if(drmSetClientCap(drm.drmfd, DRM_CLIENT_CAP_ATOMIC, 1) != 0) {

View File

@ -139,9 +139,10 @@ static int gsr_capture_kms_cuda_start(gsr_capture *cap, AVCodecContext *video_co
}
cap_kms->using_wayland_capture = true;
} else {
if(gsr_kms_client_init(&cap_kms->kms_client, cap_kms->params.card_path) != 0) {
int kms_init_res = gsr_kms_client_init(&cap_kms->kms_client, cap_kms->params.card_path);
if(kms_init_res != 0) {
gsr_capture_kms_cuda_stop(cap, video_codec_context);
return -1;
return kms_init_res;
}
MonitorCallbackUserdata monitor_callback_userdata = {

View File

@ -142,9 +142,10 @@ static int gsr_capture_kms_vaapi_start(gsr_capture *cap, AVCodecContext *video_c
}
cap_kms->using_wayland_capture = true;
} else {
if(gsr_kms_client_init(&cap_kms->kms_client, cap_kms->params.card_path) != 0) {
int kms_init_res = gsr_kms_client_init(&cap_kms->kms_client, cap_kms->params.card_path);
if(kms_init_res != 0) {
gsr_capture_kms_vaapi_stop(cap, video_codec_context);
return -1;
return kms_init_res;
}
MonitorCallbackUserdata monitor_callback_userdata = {

View File

@ -536,6 +536,8 @@ void gsr_egl_unload(gsr_egl *self) {
}
bool gsr_egl_supports_wayland_capture(gsr_egl *self) {
// TODO: wlroots capture is broken right now (black screen) on amd and multiple monitors
// so it has to be disabled right now. Find out why it happens and fix it.
(void)self;
return false;
//return !!self->wayland.export_manager && self->wayland.num_outputs > 0;

View File

@ -1687,9 +1687,10 @@ int main(int argc, char **argv) {
if(replay_buffer_size_secs == -1)
video_stream = create_stream(av_format_context, video_codec_context);
if(gsr_capture_start(capture, video_codec_context) != 0) {
int capture_result = gsr_capture_start(capture, video_codec_context);
if(capture_result != 0) {
fprintf(stderr, "gsr error: gsr_capture_start failed\n");
_exit(1);
_exit(capture_result);
}
open_video(video_codec_context, quality, very_old_gpu, gpu_inf.vendor, pixel_format);