Attempt to fix nvidia driver bug at program exit (freeze) by exit without atexit
This commit is contained in:
		
							parent
							
								
									6641eda702
								
							
						
					
					
						commit
						561ceb1949
					
				
							
								
								
									
										64
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										64
									
								
								src/main.cpp
									
									
									
									
									
								
							| @ -241,7 +241,7 @@ static AVCodecContext* create_audio_codec_context(int fps, AudioCodec audio_code | ||||
|     const AVCodec *codec = avcodec_find_encoder(audio_codec_get_id(audio_codec)); | ||||
|     if (!codec) { | ||||
|         fprintf(stderr, "Error: Could not find %s audio encoder\n", audio_codec_get_name(audio_codec)); | ||||
|         exit(1); | ||||
|         _exit(1); | ||||
|     } | ||||
| 
 | ||||
|     AVCodecContext *codec_context = avcodec_alloc_context3(codec); | ||||
| @ -481,13 +481,13 @@ static AVFrame* open_audio(AVCodecContext *audio_codec_context) { | ||||
|     ret = avcodec_open2(audio_codec_context, audio_codec_context->codec, &options); | ||||
|     if(ret < 0) { | ||||
|         fprintf(stderr, "failed to open codec, reason: %s\n", av_error_to_string(ret)); | ||||
|         exit(1); | ||||
|         _exit(1); | ||||
|     } | ||||
| 
 | ||||
|     AVFrame *frame = av_frame_alloc(); | ||||
|     if(!frame) { | ||||
|         fprintf(stderr, "failed to allocate audio frame\n"); | ||||
|         exit(1); | ||||
|         _exit(1); | ||||
|     } | ||||
| 
 | ||||
|     frame->sample_rate = audio_codec_context->sample_rate; | ||||
| @ -503,7 +503,7 @@ static AVFrame* open_audio(AVCodecContext *audio_codec_context) { | ||||
|     ret = av_frame_get_buffer(frame, 0); | ||||
|     if(ret < 0) { | ||||
|         fprintf(stderr, "failed to allocate audio data buffers, reason: %s\n", av_error_to_string(ret)); | ||||
|         exit(1); | ||||
|         _exit(1); | ||||
|     } | ||||
| 
 | ||||
|     return frame; | ||||
| @ -629,7 +629,7 @@ static void open_video(AVCodecContext *codec_context, VideoQuality video_quality | ||||
|     int ret = avcodec_open2(codec_context, codec_context->codec, &options); | ||||
|     if (ret < 0) { | ||||
|         fprintf(stderr, "Error: Could not open video codec: %s\n", av_error_to_string(ret)); | ||||
|         exit(1); | ||||
|         _exit(1); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -696,12 +696,12 @@ static void usage_full() { | ||||
|     fprintf(stderr, "  gpu-screen-recorder -w screen -f 60 -a \"$(pactl get-default-sink).monitor\" -o video.mp4\n"); | ||||
|     fprintf(stderr, "  gpu-screen-recorder -w screen -f 60 -a \"$(pactl get-default-sink).monitor|$(pactl get-default-source)\" -o video.mp4\n"); | ||||
|     //fprintf(stderr, "  gpu-screen-recorder -w screen -f 60 -q ultra -pixfmt yuv444 -o video.mp4\n");
 | ||||
|     exit(1); | ||||
|     _exit(1); | ||||
| } | ||||
| 
 | ||||
| static void usage() { | ||||
|     usage_header(); | ||||
|     exit(1); | ||||
|     _exit(1); | ||||
| } | ||||
| 
 | ||||
| static sig_atomic_t running = 1; | ||||
| @ -760,7 +760,7 @@ static AVStream* create_stream(AVFormatContext *av_format_context, AVCodecContex | ||||
|     AVStream *stream = avformat_new_stream(av_format_context, nullptr); | ||||
|     if (!stream) { | ||||
|         fprintf(stderr, "Error: Could not allocate stream\n"); | ||||
|         exit(1); | ||||
|         _exit(1); | ||||
|     } | ||||
|     stream->id = av_format_context->nb_streams - 1; | ||||
|     stream->time_base = codec_context->time_base; | ||||
| @ -1231,7 +1231,7 @@ int main(int argc, char **argv) { | ||||
|                 for(const auto &existing_audio_input : audio_inputs) { | ||||
|                     fprintf(stderr, "    %s\n", existing_audio_input.name.c_str()); | ||||
|                 } | ||||
|                 exit(2); | ||||
|                 _exit(2); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @ -1240,7 +1240,7 @@ int main(int argc, char **argv) { | ||||
|     int fps = atoi(args["-f"].value()); | ||||
|     if(fps == 0) { | ||||
|         fprintf(stderr, "Invalid fps argument: %s\n", args["-f"].value()); | ||||
|         return 1; | ||||
|         _exit(1); | ||||
|     } | ||||
|     if(fps < 1) | ||||
|         fps = 1; | ||||
| @ -1269,7 +1269,7 @@ int main(int argc, char **argv) { | ||||
|         replay_buffer_size_secs = atoi(replay_buffer_size_secs_str); | ||||
|         if(replay_buffer_size_secs < 5 || replay_buffer_size_secs > 1200) { | ||||
|             fprintf(stderr, "Error: option -r has to be between 5 and 1200, was: %s\n", replay_buffer_size_secs_str); | ||||
|             return 1; | ||||
|             _exit(1); | ||||
|         } | ||||
|         replay_buffer_size_secs += 5; // Add a few seconds to account of lost packets because of non-keyframe packets skipped
 | ||||
|     } | ||||
| @ -1277,7 +1277,7 @@ int main(int argc, char **argv) { | ||||
|     Display *dpy = XOpenDisplay(nullptr); | ||||
|     if (!dpy) { | ||||
|         fprintf(stderr, "Error: Failed to open display. Make sure you are running x11\n"); | ||||
|         return 2; | ||||
|         _exit(2); | ||||
|     } | ||||
| 
 | ||||
|     XSetErrorHandler(x11_error_handler); | ||||
| @ -1285,13 +1285,13 @@ int main(int argc, char **argv) { | ||||
| 
 | ||||
|     if(is_xwayland(dpy)) { | ||||
|         fprintf(stderr, "Error: GPU Screen Recorder only works in a pure X11 session. Xwayland is not supported\n"); | ||||
|         return 2; | ||||
|         _exit(2); | ||||
|     } | ||||
| 
 | ||||
|     gsr_gpu_info gpu_inf; | ||||
|     bool very_old_gpu = false; | ||||
|     if(!gl_get_gpu_info(dpy, &gpu_inf)) | ||||
|         return 2; | ||||
|         _exit(2); | ||||
| 
 | ||||
|     if(gpu_inf.vendor == GSR_GPU_VENDOR_NVIDIA && gpu_inf.gpu_version != 0 && gpu_inf.gpu_version < 900) { | ||||
|         fprintf(stderr, "Info: your gpu appears to be very old (older than maxwell architecture). Switching to lower preset\n"); | ||||
| @ -1308,7 +1308,7 @@ int main(int argc, char **argv) { | ||||
|         // TODO: Allow specifying another card, and in other places
 | ||||
|         if(!gsr_get_valid_card_path(card_path)) { | ||||
|             fprintf(stderr, "Error: no /dev/dri/cardX device found\n"); | ||||
|             return 2; | ||||
|             _exit(2); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -1367,7 +1367,7 @@ int main(int argc, char **argv) { | ||||
|                 fprintf(stderr, "    \"screen-direct\"    (%dx%d+%d+%d)\n", XWidthOfScreen(DefaultScreenOfDisplay(dpy)), XHeightOfScreen(DefaultScreenOfDisplay(dpy)), 0, 0); | ||||
|                 fprintf(stderr, "    \"screen-direct-force\"    (%dx%d+%d+%d)\n", XWidthOfScreen(DefaultScreenOfDisplay(dpy)), XHeightOfScreen(DefaultScreenOfDisplay(dpy)), 0, 0); | ||||
|                 for_each_active_monitor_output(dpy, monitor_output_callback_print, NULL); | ||||
|                 return 1; | ||||
|                 _exit(1); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| @ -1396,7 +1396,7 @@ int main(int argc, char **argv) { | ||||
|             nvfbc_params.overclock = overclock; | ||||
|             capture = gsr_capture_nvfbc_create(&nvfbc_params); | ||||
|             if(!capture) | ||||
|                 return 1; | ||||
|                 _exit(1); | ||||
|         } else { | ||||
|             const char *capture_target = window_str; | ||||
|             if(strcmp(window_str, "screen-direct") == 0 || strcmp(window_str, "screen-direct-force") == 0) { | ||||
| @ -1409,7 +1409,7 @@ int main(int argc, char **argv) { | ||||
|             kms_params.card_path = card_path; | ||||
|             capture = gsr_capture_kms_vaapi_create(&kms_params); | ||||
|             if(!capture) | ||||
|                 return 1; | ||||
|                 _exit(1); | ||||
|         } | ||||
|     } else { | ||||
|         errno = 0; | ||||
| @ -1430,7 +1430,7 @@ int main(int argc, char **argv) { | ||||
|                 xcomposite_params.card_path = card_path; | ||||
|                 capture = gsr_capture_xcomposite_vaapi_create(&xcomposite_params); | ||||
|                 if(!capture) | ||||
|                     return 1; | ||||
|                     _exit(1); | ||||
|                 break; | ||||
|             } | ||||
|             case GSR_GPU_VENDOR_INTEL: { | ||||
| @ -1441,7 +1441,7 @@ int main(int argc, char **argv) { | ||||
|                 xcomposite_params.card_path = card_path; | ||||
|                 capture = gsr_capture_xcomposite_vaapi_create(&xcomposite_params); | ||||
|                 if(!capture) | ||||
|                     return 1; | ||||
|                     _exit(1); | ||||
|                 break; | ||||
|             } | ||||
|             case GSR_GPU_VENDOR_NVIDIA: { | ||||
| @ -1452,7 +1452,7 @@ int main(int argc, char **argv) { | ||||
|                 xcomposite_params.overclock = overclock; | ||||
|                 capture = gsr_capture_xcomposite_cuda_create(&xcomposite_params); | ||||
|                 if(!capture) | ||||
|                     return 1; | ||||
|                     _exit(1); | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
| @ -1491,7 +1491,7 @@ int main(int argc, char **argv) { | ||||
|     avformat_alloc_output_context2(&av_format_context, nullptr, container_format, filename); | ||||
|     if (!av_format_context) { | ||||
|         fprintf(stderr, "Error: Failed to deduce container format from file extension\n"); | ||||
|         return 1; | ||||
|         _exit(1); | ||||
|     } | ||||
| 
 | ||||
|     const AVOutputFormat *output_format = av_format_context->oformat; | ||||
| @ -1585,7 +1585,7 @@ int main(int argc, char **argv) { | ||||
|             "  This may be the case on corporate distros such as Manjaro.\n" | ||||
|             "  You can test this by running 'vainfo | grep VAEntrypointEncSlice' to see if it matches any H264/HEVC profile. vainfo is part of libva-utils.\n" | ||||
|             "  On such distros, you need to manually install mesa from source to enable H264/HEVC hardware acceleration, or use a more user friendly distro.\n", video_codec_name, video_codec_name, video_codec_name); | ||||
|         exit(2); | ||||
|         _exit(2); | ||||
|     } | ||||
| 
 | ||||
|     const bool is_livestream = is_livestream_path(filename); | ||||
| @ -1607,7 +1607,7 @@ int main(int argc, char **argv) { | ||||
| 
 | ||||
|     if(gsr_capture_start(capture, video_codec_context) != 0) { | ||||
|         fprintf(stderr, "gsr error: gsr_capture_start failed\n"); | ||||
|         return 1; | ||||
|         _exit(1); | ||||
|     } | ||||
| 
 | ||||
|     open_video(video_codec_context, quality, very_old_gpu, gpu_inf.vendor, pixel_format); | ||||
| @ -1642,7 +1642,7 @@ int main(int argc, char **argv) { | ||||
|             int err = init_filter_graph(audio_codec_context, &graph, &sink, src_filter_ctx, merged_audio_inputs.audio_inputs.size()); | ||||
|             if(err < 0) { | ||||
|                 fprintf(stderr, "Error: failed to create audio filter\n"); | ||||
|                 exit(1); | ||||
|                 _exit(1); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
| @ -1665,7 +1665,7 @@ int main(int argc, char **argv) { | ||||
|             } else { | ||||
|                 if(sound_device_get_by_name(&audio_device.sound_device, audio_input.name.c_str(), audio_input.description.c_str(), num_channels, audio_codec_context->frame_size, audio_codec_context_get_audio_format(audio_codec_context)) != 0) { | ||||
|                     fprintf(stderr, "Error: failed to get \"%s\" sound device\n", audio_input.name.c_str()); | ||||
|                     exit(1); | ||||
|                     _exit(1); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
| @ -1690,7 +1690,7 @@ int main(int argc, char **argv) { | ||||
|         int ret = avio_open(&av_format_context->pb, filename, AVIO_FLAG_WRITE); | ||||
|         if (ret < 0) { | ||||
|             fprintf(stderr, "Error: Could not open '%s': %s\n", filename, av_error_to_string(ret)); | ||||
|             return 1; | ||||
|             _exit(1); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -1702,7 +1702,7 @@ int main(int argc, char **argv) { | ||||
|         int ret = avformat_write_header(av_format_context, &options); | ||||
|         if (ret < 0) { | ||||
|             fprintf(stderr, "Error occurred when writing header to output file: %s\n", av_error_to_string(ret)); | ||||
|             return 1; | ||||
|             _exit(1); | ||||
|         } | ||||
| 
 | ||||
|         av_dict_free(&options); | ||||
| @ -1717,7 +1717,7 @@ int main(int argc, char **argv) { | ||||
|     AVFrame *frame = av_frame_alloc(); | ||||
|     if (!frame) { | ||||
|         fprintf(stderr, "Error: Failed to allocate frame\n"); | ||||
|         exit(1); | ||||
|         _exit(1); | ||||
|     } | ||||
|     frame->format = video_codec_context->pix_fmt; | ||||
|     frame->width = video_codec_context->width; | ||||
| @ -1739,7 +1739,7 @@ int main(int argc, char **argv) { | ||||
|     uint8_t *empty_audio = (uint8_t*)malloc(audio_buffer_size); | ||||
|     if(!empty_audio) { | ||||
|         fprintf(stderr, "Error: failed to create empty audio\n"); | ||||
|         exit(1); | ||||
|         _exit(1); | ||||
|     } | ||||
|     memset(empty_audio, 0, audio_buffer_size); | ||||
| 
 | ||||
| @ -1753,7 +1753,7 @@ int main(int argc, char **argv) { | ||||
|                     swr = swr_alloc(); | ||||
|                     if(!swr) { | ||||
|                         fprintf(stderr, "Failed to create SwrContext\n"); | ||||
|                         exit(1); | ||||
|                         _exit(1); | ||||
|                     } | ||||
|                     av_opt_set_int(swr, "in_channel_layout", AV_CH_LAYOUT_STEREO, 0); | ||||
|                     av_opt_set_int(swr, "out_channel_layout", AV_CH_LAYOUT_STEREO, 0); | ||||
| @ -2032,5 +2032,5 @@ int main(int argc, char **argv) { | ||||
|     } | ||||
| 
 | ||||
|     free(empty_audio); | ||||
|     return should_stop_error ? 3 : 0; | ||||
|     _exit(should_stop_error ? 3 : 0); | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 dec05eba
						dec05eba