aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2022-10-12 04:53:56 +0200
committerdec05eba <dec05eba@protonmail.com>2022-10-12 04:53:56 +0200
commitdc20d1eddb1a2a569a96c09c2dccd9018167ab26 (patch)
tree379548c29826b643286458ef358b609924133ea2 /src
parent9d185f309151a198e2f51e613e9a9dfaff5f6d6d (diff)
Do not use p4, p7 with old ffmpeg that doesn't have those options yet
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp64
1 files changed, 49 insertions, 15 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 316a5f2..8f12628 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -793,20 +793,54 @@ static void open_video(AVCodecContext *codec_context,
codec_context->hw_device_ctx = *device_ctx;
codec_context->hw_frames_ctx = frame_context;
+ bool supports_p4 = false;
+ bool supports_p7 = false;
+
+ const AVOption *opt = nullptr;
+ while((opt = av_opt_next(codec_context->priv_data, opt))) {
+ if(opt->type == AV_OPT_TYPE_CONST) {
+ if(strcmp(opt->name, "p4") == 0)
+ supports_p4 = true;
+ else if(strcmp(opt->name, "p7") == 0)
+ supports_p7 = true;
+ }
+ }
+
AVDictionary *options = nullptr;
- switch(video_quality) {
- case VideoQuality::MEDIUM:
- av_dict_set_int(&options, "qp", 40, 0);
- break;
- case VideoQuality::HIGH:
- av_dict_set_int(&options, "qp", 35, 0);
- break;
- case VideoQuality::VERY_HIGH:
- av_dict_set_int(&options, "qp", 30, 0);
- break;
- case VideoQuality::ULTRA:
- av_dict_set_int(&options, "qp", 24, 0);
- break;
+ if(very_old_gpu || !supports_p7) {
+ switch(video_quality) {
+ case VideoQuality::MEDIUM:
+ av_dict_set_int(&options, "qp", 37, 0);
+ break;
+ case VideoQuality::HIGH:
+ av_dict_set_int(&options, "qp", 32, 0);
+ break;
+ case VideoQuality::VERY_HIGH:
+ av_dict_set_int(&options, "qp", 27, 0);
+ break;
+ case VideoQuality::ULTRA:
+ av_dict_set_int(&options, "qp", 21, 0);
+ break;
+ }
+ } else {
+ switch(video_quality) {
+ case VideoQuality::MEDIUM:
+ av_dict_set_int(&options, "qp", 40, 0);
+ break;
+ case VideoQuality::HIGH:
+ av_dict_set_int(&options, "qp", 35, 0);
+ break;
+ case VideoQuality::VERY_HIGH:
+ av_dict_set_int(&options, "qp", 30, 0);
+ break;
+ case VideoQuality::ULTRA:
+ av_dict_set_int(&options, "qp", 24, 0);
+ break;
+ }
+ }
+
+ if(!supports_p4 && !supports_p7) {
+ fprintf(stderr, "Info: your ffmpeg version is outdated. It's recommended that you use the flatpak version of gpu-screen-recorder version instead, which you can find at https://flathub.org/apps/details/com.dec05eba.gpu_screen_recorder\n");
}
//if(is_livestream) {
@@ -819,9 +853,9 @@ static void open_video(AVCodecContext *codec_context,
// with pretty good performance but you now have to choose p1-p7, which are gpu agnostic and on
// older gpus p5-p7 slow the gpu down to a crawl...
// "hq" is now just an alias for p7 in ffmpeg :(
- if(very_old_gpu)
+ if(very_old_gpu && supports_p4)
av_dict_set(&options, "preset", "p4", 0);
- else
+ else if(supports_p7)
av_dict_set(&options, "preset", "p7", 0);
av_dict_set(&options, "tune", "hq", 0);
av_dict_set(&options, "rc", "constqp", 0);