From b193f6fee44aec04852420d24777f511cb7131bc Mon Sep 17 00:00:00 2001 From: dec05eba Date: Sun, 30 Aug 2020 05:04:10 +0200 Subject: [PATCH] Add -q quality flag. Set to high by default. Valid values: high, ultra --- interactive.sh | 2 +- src/main.cpp | 48 ++++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/interactive.sh b/interactive.sh index ed463df..425cd25 100755 --- a/interactive.sh +++ b/interactive.sh @@ -29,4 +29,4 @@ read output_file_name output_dir=$(dirname "$output_file_name") mkdir -p "$output_dir" -./sibs-build/linux_x86_64/release/gpu-screen-recorder -w "$window_id" -c mp4 -f "$fps" -a "$selected_audio_input" > "$output_file_name" +./sibs-build/linux_x86_64/release/gpu-screen-recorder -w "$window_id" -c mp4 -f "$fps" -a "$selected_audio_input" -o "$output_file_name" diff --git a/src/main.cpp b/src/main.cpp index a4eb0f7..fe00838 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -87,6 +87,11 @@ struct WindowPixmap { GLint texture_height; }; +enum class VideoQuality { + HIGH, + ULTRA +}; + static bool x11_supports_composite_named_window_pixmap(Display *dpy) { int extension_major; int extension_minor; @@ -400,7 +405,7 @@ static AVStream *add_audio_stream(AVFormatContext *av_format_context, AVCodec ** } static AVStream *add_video_stream(AVFormatContext *av_format_context, AVCodec **codec, - enum AVCodecID codec_id, + VideoQuality video_quality, const WindowPixmap &window_pixmap, int fps) { //*codec = avcodec_find_encoder(codec_id); @@ -446,11 +451,22 @@ static AVStream *add_video_stream(AVFormatContext *av_format_context, AVCodec ** codec_context->max_b_frames = 2; codec_context->pix_fmt = AV_PIX_FMT_CUDA; codec_context->color_range = AVCOL_RANGE_JPEG; - codec_context->qmin = 16; - codec_context->qmax = 27; - av_opt_set(codec_context->priv_data, "preset", "slow", 0); - av_opt_set(codec_context->priv_data, "profile", "high", 0); - codec_context->profile = FF_PROFILE_H264_HIGH; + switch(video_quality) { + case VideoQuality::HIGH: + codec_context->qmin = 18; + codec_context->qmax = 27; + av_opt_set(codec_context->priv_data, "preset", "slow", 0); + av_opt_set(codec_context->priv_data, "profile", "baseline", 0); + codec_context->profile = FF_PROFILE_H264_BASELINE; + break; + case VideoQuality::ULTRA: + codec_context->qmin = 16; + codec_context->qmax = 25; + av_opt_set(codec_context->priv_data, "preset", "slow", 0); + av_opt_set(codec_context->priv_data, "profile", "high", 0); + codec_context->profile = FF_PROFILE_H264_HIGH; + break; + } stream->time_base = codec_context->time_base; stream->avg_frame_rate = av_inv_q(codec_context->time_base); if (codec_context->codec_id == AV_CODEC_ID_MPEG1VIDEO) @@ -587,12 +603,13 @@ static void close_video(AVStream *video_stream, AVFrame *frame) { } static void usage() { - fprintf(stderr, "usage: gpu-screen-recorder -w -c -f [-a ] [-r ] [-o ]\n"); + fprintf(stderr, "usage: gpu-screen-recorder -w -c -f [-a ] [-q ] [-r ] [-o ]\n"); fprintf(stderr, "OPTIONS:\n"); fprintf(stderr, " -w Window to record.\n"); fprintf(stderr, " -c Container format for output file, for example mp4, or flv.\n"); fprintf(stderr, " -f Framerate to record at.\n"); fprintf(stderr, " -a Audio device to record from (pulse audio device). Optional, disabled by default.\n"); + fprintf(stderr, " -q Video quality. Should either be 'high' or 'ultra'. Optional, set to 'high' be default.\n"); fprintf(stderr, " -r Replay buffer size in seconds. If this is set, then only the last seconds as set by this option will be stored" " and the video will only be saved when the gpu-screen-recorder is closed. This feature is similar to Nvidia's instant replay feature." " This option has be between 5 and 1200. Note that the replay buffer size will not always be precise, because of keyframes. Optional, disabled by default.\n"); @@ -619,6 +636,7 @@ int main(int argc, char **argv) { { "-c", Arg { nullptr, false } }, { "-f", Arg { nullptr, false } }, { "-a", Arg { nullptr, true } }, + { "-q", Arg { nullptr, true } }, { "-o", Arg { nullptr, true } }, { "-r", Arg { nullptr, true} } }; @@ -647,6 +665,20 @@ int main(int argc, char **argv) { return 1; } + const char *quality_str = args["-q"].value; + if(!quality_str) + quality_str = "high"; + + VideoQuality quality; + if(strcmp(quality_str, "high") == 0) { + quality = VideoQuality::HIGH; + } else if(strcmp(quality_str, "ultra") == 0) { + quality = VideoQuality::ULTRA; + } else { + fprintf(stderr, "Error: -q should either be 'high' or 'ultra', got: %s\n", quality_str); + usage(); + } + const char *filename = args["-o"].value; if(!filename) filename = "/dev/stdout"; @@ -746,7 +778,7 @@ int main(int argc, char **argv) { AVCodec *video_codec; AVStream *video_stream = - add_video_stream(av_format_context, &video_codec, output_format->video_codec, + add_video_stream(av_format_context, &video_codec, quality, window_pixmap, fps); if (!video_stream) { fprintf(stderr, "Error: Failed to create video stream\n");