From c42784794414d9918f4966635dc8e8dae6028cf7 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 23 Sep 2018 18:43:26 -0500 Subject: [PATCH 1/4] [record] define quality profiles --- configuration.c | 11 ++- configuration.h | 2 + menu/menu_setting.c | 16 ---- record/drivers/record_ffmpeg.c | 151 ++++++++++++++++++++++----------- record/record_driver.c | 5 -- record/record_driver.h | 11 +-- 6 files changed, 121 insertions(+), 75 deletions(-) diff --git a/configuration.c b/configuration.c index 524efd6180..758e111fc6 100644 --- a/configuration.c +++ b/configuration.c @@ -54,6 +54,10 @@ #include "../list_special.h" +#ifdef HAVE_FFMPEG +#include "record/record_driver.h" +#endif + static const char* invalid_filename_chars[] = { /* https://support.microsoft.com/en-us/help/905231/information-about-the-characters-that-you-cannot-use-in-site-names--fo */ "~", "#", "%", "&", "*", "{", "}", "\\", ":", "[", "]", "?", "/", "|", "\'", "\"", @@ -1593,7 +1597,6 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, SETTING_UINT("aspect_ratio_index", &settings->uints.video_aspect_ratio_idx, true, aspect_ratio_idx, false); #ifdef HAVE_NETWORKING SETTING_UINT("netplay_ip_port", &settings->uints.netplay_port, true, RARCH_DEFAULT_PORT, false); - SETTING_UINT("video_stream_port", &settings->uints.video_stream_port, true, RARCH_STREAM_DEFAULT_PORT, false); SETTING_OVERRIDE(RARCH_OVERRIDE_SETTING_NETPLAY_IP_PORT); SETTING_UINT("netplay_input_latency_frames_min",&settings->uints.netplay_input_latency_frames_min, true, 0, false); SETTING_UINT("netplay_input_latency_frames_range",&settings->uints.netplay_input_latency_frames_range, true, 0, false); @@ -1614,6 +1617,12 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, SETTING_UINT("midi_volume", &settings->uints.midi_volume, true, midi_volume, false); +#ifdef HAVE_FFMPEG + SETTING_UINT("video_stream_port", &settings->uints.video_stream_port, true, RARCH_STREAM_DEFAULT_PORT, false); + SETTING_UINT("video_record_quality", &settings->uints.video_record_quality, true, RECORD_CONFIG_TYPE_RECORDING_LOSSLESS_QUALITY, false); + SETTING_UINT("video_stream_quality", &settings->uints.video_record_quality, true, RECORD_CONFIG_TYPE_STREAMING_LOW_QUALITY, false); +#endif + *size = count; return tmp; diff --git a/configuration.h b/configuration.h index fd84cda742..291e27d942 100644 --- a/configuration.h +++ b/configuration.h @@ -388,6 +388,8 @@ typedef struct settings unsigned video_msg_bgcolor_green; unsigned video_msg_bgcolor_blue; unsigned video_stream_port; + unsigned video_record_quality; + unsigned video_stream_quality; unsigned menu_thumbnails; unsigned menu_left_thumbnails; diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 629f240197..50090a759d 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -5952,22 +5952,6 @@ static bool setting_append_list( general_read_handler); settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); - CONFIG_BOOL( - list, list_info, - recording_driver_get_use_output_dir_ptr(), - MENU_ENUM_LABEL_RECORD_USE_OUTPUT_DIRECTORY, - MENU_ENUM_LABEL_VALUE_RECORD_USE_OUTPUT_DIRECTORY, - false, - MENU_ENUM_LABEL_VALUE_OFF, - MENU_ENUM_LABEL_VALUE_ON, - &group_info, - &subgroup_info, - parent_group, - general_write_handler, - general_read_handler, - SD_FLAG_NONE - ); - END_SUB_GROUP(list, list_info, parent_group); START_SUB_GROUP(list, list_info, "Miscellaneous", &group_info, &subgroup_info, parent_group); diff --git a/record/drivers/record_ffmpeg.c b/record/drivers/record_ffmpeg.c index 5194681266..c20a61333d 100644 --- a/record/drivers/record_ffmpeg.c +++ b/record/drivers/record_ffmpeg.c @@ -89,6 +89,10 @@ extern "C" { #define PIX_FMT_YUV444P AV_PIX_FMT_YUV444P #endif +#ifndef PIX_FMT_YUV420P +#define PIX_FMT_YUV420P AV_PIX_FMT_YUV420P +#endif + #ifndef PIX_FMT_BGR24 #define PIX_FMT_BGR24 AV_PIX_FMT_BGR24 #endif @@ -544,29 +548,112 @@ static bool ffmpeg_init_video(ffmpeg_t *handle) return true; } -static bool ffmpeg_init_config_common(struct ff_config_param *params) +static bool ffmpeg_init_config_common(struct ff_config_param *params, unsigned preset) { - params->scale_factor = 1; - params->threads = 1; - params->frame_drop_ratio = 1; - params->audio_enable = true; - params->audio_global_quality = 75; - params->out_pix_fmt = PIX_FMT_YUV444P; + char buf[256]; - strlcpy(params->vcodec, "libx264", sizeof(params->vcodec)); - strlcpy(params->acodec, "libmp3lame", sizeof(params->acodec)); - strlcpy(params->format, "flv", sizeof(params->format)); + switch (preset) + { + case RECORD_CONFIG_TYPE_RECORDING_LOW_QUALITY: + case RECORD_CONFIG_TYPE_STREAMING_LOW_QUALITY: + params->scale_factor = 1; + params->threads = 1; + params->frame_drop_ratio = 1; + params->audio_enable = true; + params->audio_global_quality = 75; + params->out_pix_fmt = PIX_FMT_YUV420P; - av_dict_set(¶ms->video_opts, "video_preset", "ultrafast", 0); - av_dict_set(¶ms->video_opts, "video_tune", "ultrafast", 0); - av_dict_set(¶ms->video_opts, "video_crf", "18", 0); - av_dict_set(¶ms->audio_opts, "audio_global_quality", "75", 0); + strlcpy(params->vcodec, "libx264", sizeof(params->vcodec)); + strlcpy(params->acodec, "libmp3lame", sizeof(params->acodec)); + + av_dict_set(¶ms->video_opts, "preset", "ultrafast", 0); + av_dict_set(¶ms->video_opts, "tune", "animation", 0); + av_dict_set(¶ms->video_opts, "crf", "30", 0); + av_dict_set(¶ms->audio_opts, "audio_global_quality", "75", 0); + break; + case RECORD_CONFIG_TYPE_RECORDING_MED_QUALITY: + case RECORD_CONFIG_TYPE_STREAMING_MED_QUALITY: + params->scale_factor = 1; + params->threads = 1; + params->frame_drop_ratio = 1; + params->audio_enable = true; + params->audio_global_quality = 75; + params->out_pix_fmt = PIX_FMT_YUV420P; + + strlcpy(params->vcodec, "libx264", sizeof(params->vcodec)); + strlcpy(params->acodec, "libmp3lame", sizeof(params->acodec)); + + av_dict_set(¶ms->video_opts, "preset", "superfast", 0); + av_dict_set(¶ms->video_opts, "tune", "animation", 0); + av_dict_set(¶ms->video_opts, "crf", "25", 0); + av_dict_set(¶ms->audio_opts, "audio_global_quality", "75", 0); + break; + case RECORD_CONFIG_TYPE_RECORDING_HIGH_QUALITY: + case RECORD_CONFIG_TYPE_STREAMING_HIGH_QUALITY: + params->scale_factor = 1; + params->threads = 1; + params->frame_drop_ratio = 1; + params->audio_enable = true; + params->audio_global_quality = 100; + params->out_pix_fmt = PIX_FMT_YUV444P; + + strlcpy(params->vcodec, "libx264", sizeof(params->vcodec)); + strlcpy(params->acodec, "libmp3lame", sizeof(params->acodec)); + + av_dict_set(¶ms->video_opts, "preset", "medium", 0); + av_dict_set(¶ms->video_opts, "tune", "animation", 0); + av_dict_set(¶ms->video_opts, "crf", "15", 0); + av_dict_set(¶ms->audio_opts, "audio_global_quality", "100", 0); + break; + case RECORD_CONFIG_TYPE_RECORDING_LOSSLESS_QUALITY: + params->scale_factor = 1; + params->threads = 1; + params->frame_drop_ratio = 1; + params->audio_enable = true; + params->audio_global_quality = 100; + params->out_pix_fmt = PIX_FMT_BGR24; + + strlcpy(params->vcodec, "libx264rgb", sizeof(params->vcodec)); + strlcpy(params->acodec, "flac", sizeof(params->acodec)); + + av_dict_set(¶ms->video_opts, "preset", "medium", 0); + av_dict_set(¶ms->video_opts, "tune", "animation", 0); + av_dict_set(¶ms->video_opts, "crf", "0", 0); + av_dict_set(¶ms->audio_opts, "audio_global_quality", "100", 0); + break; + case RECORD_CONFIG_TYPE_STREAMING_NETPLAY: + params->scale_factor = 1; + params->threads = 1; + params->frame_drop_ratio = 1; + params->audio_enable = true; + params->audio_global_quality = 50; + params->out_pix_fmt = PIX_FMT_YUV420P; + + strlcpy(params->vcodec, "libx264", sizeof(params->vcodec)); + strlcpy(params->acodec, "mp3", sizeof(params->acodec)); + + av_dict_set(¶ms->video_opts, "preset", "ultrafast", 0); + av_dict_set(¶ms->video_opts, "tune", "zerolatency", 0); + av_dict_set(¶ms->video_opts, "crf", "20", 0); + av_dict_set(¶ms->audio_opts, "audio_global_quality", "50", 0); + break; + default: + break; + } + + if (preset <= RECORD_CONFIG_TYPE_RECORDING_LOSSLESS_QUALITY) + strlcpy(params->format, "matroska", sizeof(params->format)); + else if (preset <= RECORD_CONFIG_TYPE_STREAMING_HIGH_QUALITY) + strlcpy(params->format, "flv", sizeof(params->format)); + else + strlcpy(params->format, "flv", sizeof(params->format)); return true; } static bool ffmpeg_init_config_recording(struct ff_config_param *params) { + return true; params->threads = 0; params->audio_global_quality = 100; @@ -703,7 +790,7 @@ static bool ffmpeg_init_muxer_post(ffmpeg_t *handle) } av_dict_set(&handle->muxer.ctx->metadata, "title", - "RetroArch video dump", 0); + "RetroArch Video Dump", 0); return avformat_write_header(handle->muxer.ctx, NULL) >= 0; } @@ -843,39 +930,7 @@ static void *ffmpeg_new(const struct record_params *params) goto error; } else - { - - switch (params->config_type) - { - case RECORD_CONFIG_TYPE_RECORDING_LOW_QUALITY: - ffmpeg_init_config_common(&handle->config); - ffmpeg_init_config_recording(&handle->config); - break; - case RECORD_CONFIG_TYPE_RECORDING_MED_QUALITY: - ffmpeg_init_config_common(&handle->config); - ffmpeg_init_config_recording(&handle->config); - break; - case RECORD_CONFIG_TYPE_RECORDING_HIGH_QUALITY: - ffmpeg_init_config_common(&handle->config); - ffmpeg_init_config_recording(&handle->config); - break; - case RECORD_CONFIG_TYPE_STREAM_YOUTUBE: - ffmpeg_init_config_common(&handle->config); - /* TODO/FIXME - fill this in */ - break; - case RECORD_CONFIG_TYPE_STREAM_DISCORD: - ffmpeg_init_config_common(&handle->config); - /* TODO/FIXME - fill this in */ - break; - case RECORD_CONFIG_TYPE_STREAM_TWITCH: - ffmpeg_init_config_common(&handle->config); - /* TODO/FIXME - fill this in */ - break; - default: - case RECORD_CONFIG_TYPE_RECORDING_CUSTOM: - break; - } - } + ffmpeg_init_config_common(&handle->config, params->config_type); if (!ffmpeg_init_muxer_pre(handle)) goto error; diff --git a/record/record_driver.c b/record/record_driver.c index 2506e81845..1121749c81 100644 --- a/record/record_driver.c +++ b/record/record_driver.c @@ -510,11 +510,6 @@ void recording_driver_set_data_ptr(void *data) recording_data = data; } -bool *recording_driver_get_use_output_dir_ptr(void) -{ - return &recording_use_output_dir; -} - unsigned *recording_driver_get_width(void) { return &recording_width; diff --git a/record/record_driver.h b/record/record_driver.h index 40c7e7be75..853ec5f338 100644 --- a/record/record_driver.h +++ b/record/record_driver.h @@ -37,9 +37,12 @@ enum record_config_type RECORD_CONFIG_TYPE_RECORDING_LOW_QUALITY, RECORD_CONFIG_TYPE_RECORDING_MED_QUALITY, RECORD_CONFIG_TYPE_RECORDING_HIGH_QUALITY, - RECORD_CONFIG_TYPE_STREAM_YOUTUBE, - RECORD_CONFIG_TYPE_STREAM_TWITCH, - RECORD_CONFIG_TYPE_STREAM_DISCORD + RECORD_CONFIG_TYPE_RECORDING_LOSSLESS_QUALITY, + RECORD_CONFIG_TYPE_STREAMING_CUSTOM, + RECORD_CONFIG_TYPE_STREAMING_LOW_QUALITY, + RECORD_CONFIG_TYPE_STREAMING_MED_QUALITY, + RECORD_CONFIG_TYPE_STREAMING_HIGH_QUALITY, + RECORD_CONFIG_TYPE_STREAMING_NETPLAY }; /* Parameters passed to ffemu_new() */ @@ -187,8 +190,6 @@ void recording_driver_clear_data_ptr(void); void recording_driver_set_data_ptr(void *data); -bool *recording_driver_get_use_output_dir_ptr(void); - unsigned *recording_driver_get_width(void); unsigned *recording_driver_get_height(void); From bcb960d248b9cbb6b8790aa3199d41d25047c811 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 23 Sep 2018 19:02:12 -0500 Subject: [PATCH 2/4] record] start adding menu entries --- .vscode/settings.json | 3 ++- configuration.c | 2 +- intl/msg_hash_lbl.h | 2 ++ intl/msg_hash_us.h | 6 +++++- menu/cbs/menu_cbs_deferred_push.c | 4 ++++ menu/menu_displaylist.c | 5 +++++ menu/menu_displaylist.h | 1 + menu/menu_setting.c | 31 +++++++++++++++++++++++-------- msg_hash.h | 1 + record/record_driver.c | 6 ------ 10 files changed, 44 insertions(+), 17 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 1fde8c11fd..efae5a0931 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -19,7 +19,8 @@ "iosfwd": "c", "xlocbuf": "c", "xmemory0": "c", - "ios": "c" + "ios": "c", + "list": "c" }, "C_Cpp.dimInactiveRegions": false, } \ No newline at end of file diff --git a/configuration.c b/configuration.c index 758e111fc6..57fcafdff2 100644 --- a/configuration.c +++ b/configuration.c @@ -1620,7 +1620,7 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, #ifdef HAVE_FFMPEG SETTING_UINT("video_stream_port", &settings->uints.video_stream_port, true, RARCH_STREAM_DEFAULT_PORT, false); SETTING_UINT("video_record_quality", &settings->uints.video_record_quality, true, RECORD_CONFIG_TYPE_RECORDING_LOSSLESS_QUALITY, false); - SETTING_UINT("video_stream_quality", &settings->uints.video_record_quality, true, RECORD_CONFIG_TYPE_STREAMING_LOW_QUALITY, false); + SETTING_UINT("video_stream_quality", &settings->uints.video_stream_quality, true, RECORD_CONFIG_TYPE_STREAMING_LOW_QUALITY, false); #endif *size = count; diff --git a/intl/msg_hash_lbl.h b/intl/msg_hash_lbl.h index f2e17652d5..e48254fbdd 100644 --- a/intl/msg_hash_lbl.h +++ b/intl/msg_hash_lbl.h @@ -903,6 +903,8 @@ MSG_HASH(MENU_ENUM_LABEL_RECORDING_SETTINGS, "recording_settings") MSG_HASH(MENU_ENUM_LABEL_RECORD_CONFIG, "record_config") +MSG_HASH(MENU_ENUM_LABEL_STREAM_CONFIG, + "stream_config") MSG_HASH(MENU_ENUM_LABEL_RECORD_DRIVER, "record_driver") MSG_HASH(MENU_ENUM_LABEL_MIDI_DRIVER, diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 5737f704b4..215d584580 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2151,7 +2151,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_CONFIG, - "Load Recording Config..." + "Custom Record Config" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_STREAM_CONFIG, + "Custom Stream Config" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_DRIVER, diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 4c3fac9c5c..fd5008c71b 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -118,6 +118,7 @@ generic_deferred_push(deferred_push_cheat_file_load, DISPLAYLIST_ generic_deferred_push(deferred_push_cheat_file_load_append, DISPLAYLIST_CHEAT_FILES) generic_deferred_push(deferred_push_remap_file_load, DISPLAYLIST_REMAP_FILES) generic_deferred_push(deferred_push_record_configfile, DISPLAYLIST_RECORD_CONFIG_FILES) +generic_deferred_push(deferred_push_stream_configfile, DISPLAYLIST_STREAM_CONFIG_FILES) generic_deferred_push(deferred_push_input_overlay, DISPLAYLIST_OVERLAYS) generic_deferred_push(deferred_push_video_font_path, DISPLAYLIST_FONTS) generic_deferred_push(deferred_push_xmb_font_path, DISPLAYLIST_FONTS) @@ -1034,6 +1035,9 @@ static int menu_cbs_init_bind_deferred_push_compare_label( case MENU_ENUM_LABEL_RECORD_CONFIG: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_record_configfile); break; + case MENU_ENUM_LABEL_STREAM_CONFIG: + BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_stream_configfile); + break; case MENU_ENUM_LABEL_SHADER_OPTIONS: BIND_ACTION_DEFERRED_PUSH(cbs, deferred_push_shader_options); break; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 8c2032da5e..0cee50acdc 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -7058,6 +7058,10 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) MENU_ENUM_LABEL_RECORD_CONFIG, PARSE_ONLY_PATH, false) == 0) count++; + if (menu_displaylist_parse_settings_enum(menu, info, + MENU_ENUM_LABEL_STREAM_CONFIG, + PARSE_ONLY_PATH, false) == 0) + count++; if (menu_displaylist_parse_settings_enum(menu, info, MENU_ENUM_LABEL_RECORD_PATH, PARSE_ONLY_STRING, false) == 0) @@ -7618,6 +7622,7 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, void *data) info->exts = strdup("cfg"); break; case DISPLAYLIST_RECORD_CONFIG_FILES: + case DISPLAYLIST_STREAM_CONFIG_FILES: menu_entries_ctl(MENU_ENTRIES_CTL_CLEAR, info->list); filebrowser_clear_type(); info->type_default = FILE_TYPE_RECORD_CONFIG; diff --git a/menu/menu_displaylist.h b/menu/menu_displaylist.h index 10a0ad40aa..5a8d49b79f 100644 --- a/menu/menu_displaylist.h +++ b/menu/menu_displaylist.h @@ -102,6 +102,7 @@ enum menu_displaylist_ctl_state DISPLAYLIST_CHEAT_FILES, DISPLAYLIST_REMAP_FILES, DISPLAYLIST_RECORD_CONFIG_FILES, + DISPLAYLIST_STREAM_CONFIG_FILES, DISPLAYLIST_CONFIG_FILES, DISPLAYLIST_CONTENT_HISTORY, DISPLAYLIST_IMAGES, diff --git a/menu/menu_setting.c b/menu/menu_setting.c index 50090a759d..1f9e026f43 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -5926,8 +5926,8 @@ static bool setting_append_list( START_SUB_GROUP(list, list_info, "State", &group_info, &subgroup_info, parent_group); CONFIG_PATH( list, list_info, - global->record.config, - sizeof(global->record.config), + settings->paths.path_record_config, + sizeof(settings->paths.path_record_config), MENU_ENUM_LABEL_RECORD_CONFIG, MENU_ENUM_LABEL_VALUE_RECORD_CONFIG, "", @@ -5938,19 +5938,34 @@ static bool setting_append_list( general_read_handler); menu_settings_list_current_add_values(list, list_info, "cfg"); - CONFIG_STRING( + CONFIG_PATH( list, list_info, - global->record.path, - sizeof(global->record.path), - MENU_ENUM_LABEL_RECORD_PATH, - MENU_ENUM_LABEL_VALUE_RECORD_PATH, + settings->paths.path_stream_config, + sizeof(settings->paths.path_stream_config), + MENU_ENUM_LABEL_STREAM_CONFIG, + MENU_ENUM_LABEL_VALUE_STREAM_CONFIG, "", &group_info, &subgroup_info, parent_group, general_write_handler, general_read_handler); - settings_data_list_current_add_flags(list, list_info, SD_FLAG_ALLOW_INPUT); + menu_settings_list_current_add_values(list, list_info, "cfg"); + + CONFIG_DIR( + list, list_info, + global->record.output_dir, + sizeof(global->record.output_dir), + MENU_ENUM_LABEL_SCREENSHOT_DIRECTORY, + MENU_ENUM_LABEL_VALUE_SCREENSHOT_DIRECTORY, + g_defaults.dirs[DEFAULT_DIR_SCREENSHOT], + MENU_ENUM_LABEL_VALUE_DIRECTORY_CONTENT, + &group_info, + &subgroup_info, + parent_group, + general_write_handler, + general_read_handler); + (*list)[list_info->index - 1].action_start = directory_action_start_generic; END_SUB_GROUP(list, list_info, parent_group); diff --git a/msg_hash.h b/msg_hash.h index 954b91a4e9..30038dc55a 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -1680,6 +1680,7 @@ enum msg_hash_enums MENU_LABEL(VIDEO_GPU_RECORD), MENU_LABEL(RECORD_USE_OUTPUT_DIRECTORY), MENU_LABEL(RECORD_CONFIG), + MENU_LABEL(STREAM_CONFIG), MENU_LABEL(RECORD_PATH), MENU_LABEL(VIDEO_POST_FILTER_RECORD), MENU_LABEL(RECORD_ENABLE), diff --git a/record/record_driver.c b/record/record_driver.c index 1121749c81..a6ef7af312 100644 --- a/record/record_driver.c +++ b/record/record_driver.c @@ -52,7 +52,6 @@ size_t recording_gpu_width = 0; size_t recording_gpu_height = 0; static bool recording_enable = false; static bool streaming_enable = false; -static bool recording_use_output_dir = false; static const record_driver_t *recording_driver = NULL; void *recording_data = NULL; @@ -374,10 +373,6 @@ bool recording_init(void) } } - if (recording_use_output_dir) - fill_pathname_join(output, - global->record.output_dir, - global->record.path, sizeof(output)); params.out_width = av_info->geometry.base_width; params.out_height = av_info->geometry.base_height; @@ -522,7 +517,6 @@ unsigned *recording_driver_get_height(void) void recording_driver_free_state(void) { - recording_use_output_dir = false; recording_gpu_width = 0; recording_gpu_height = 0; recording_width = 0; From 554ad5a4940d2a62ee7269df7506aed3f8737491 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 23 Sep 2018 19:29:19 -0500 Subject: [PATCH 3/4] [record] hookup quality --- record/drivers/record_ffmpeg.c | 6 ++++-- record/record_driver.c | 6 ++++++ record/record_driver.h | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/record/drivers/record_ffmpeg.c b/record/drivers/record_ffmpeg.c index c20a61333d..6c4e2b40c9 100644 --- a/record/drivers/record_ffmpeg.c +++ b/record/drivers/record_ffmpeg.c @@ -651,6 +651,7 @@ static bool ffmpeg_init_config_common(struct ff_config_param *params, unsigned p return true; } +/* static bool ffmpeg_init_config_recording(struct ff_config_param *params) { return true; @@ -667,6 +668,7 @@ static bool ffmpeg_init_config_recording(struct ff_config_param *params) return true; } +*/ static bool ffmpeg_init_config(struct ff_config_param *params, const char *config) @@ -924,13 +926,13 @@ static void *ffmpeg_new(const struct record_params *params) handle->params = *params; - if (params->config_type == RECORD_CONFIG_TYPE_RECORDING_CUSTOM) + if (params->preset == RECORD_CONFIG_TYPE_RECORDING_CUSTOM) { if (!ffmpeg_init_config(&handle->config, params->config)) goto error; } else - ffmpeg_init_config_common(&handle->config, params->config_type); + ffmpeg_init_config_common(&handle->config, params->preset); if (!ffmpeg_init_muxer_pre(handle)) goto error; diff --git a/record/record_driver.c b/record/record_driver.c index a6ef7af312..6f02833859 100644 --- a/record/record_driver.c +++ b/record/record_driver.c @@ -391,9 +391,15 @@ bool recording_init(void) else { if (streaming_is_enabled()) + { params.config = settings->paths.path_stream_config; + params.preset = settings->uints.video_stream_quality; + } else + { params.config = settings->paths.path_record_config; + params.preset = settings->uints.video_record_quality; + } } if (video_driver_supports_recording()) diff --git a/record/record_driver.h b/record/record_driver.h index 853ec5f338..400fcbe87f 100644 --- a/record/record_driver.h +++ b/record/record_driver.h @@ -69,7 +69,7 @@ struct record_params /* Audio channels. */ unsigned channels; - enum record_config_type config_type; + enum record_config_type preset; /* Input pixel format. */ enum ffemu_pix_format pix_fmt; From 58b7621559d548c4b5659ef17d8d5d4cc54e9157 Mon Sep 17 00:00:00 2001 From: radius Date: Sun, 23 Sep 2018 19:53:13 -0500 Subject: [PATCH 4/4] [record] add settings for video scale factor --- configuration.c | 2 ++ configuration.h | 2 ++ record/drivers/record_ffmpeg.c | 24 ++++++++++++++++++------ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/configuration.c b/configuration.c index 57fcafdff2..d4ec814f49 100644 --- a/configuration.c +++ b/configuration.c @@ -1621,6 +1621,8 @@ static struct config_uint_setting *populate_settings_uint(settings_t *settings, SETTING_UINT("video_stream_port", &settings->uints.video_stream_port, true, RARCH_STREAM_DEFAULT_PORT, false); SETTING_UINT("video_record_quality", &settings->uints.video_record_quality, true, RECORD_CONFIG_TYPE_RECORDING_LOSSLESS_QUALITY, false); SETTING_UINT("video_stream_quality", &settings->uints.video_stream_quality, true, RECORD_CONFIG_TYPE_STREAMING_LOW_QUALITY, false); + SETTING_UINT("video_record_scale_factor", &settings->uints.video_record_scale_factor, true, 1, false); + SETTING_UINT("video_stream_scale_factor", &settings->uints.video_stream_scale_factor, true, 1, false); #endif *size = count; diff --git a/configuration.h b/configuration.h index 291e27d942..281471252b 100644 --- a/configuration.h +++ b/configuration.h @@ -390,6 +390,8 @@ typedef struct settings unsigned video_stream_port; unsigned video_record_quality; unsigned video_stream_quality; + unsigned video_record_scale_factor; + unsigned video_stream_scale_factor; unsigned menu_thumbnails; unsigned menu_left_thumbnails; diff --git a/record/drivers/record_ffmpeg.c b/record/drivers/record_ffmpeg.c index 6c4e2b40c9..d7831962b3 100644 --- a/record/drivers/record_ffmpeg.c +++ b/record/drivers/record_ffmpeg.c @@ -550,13 +550,12 @@ static bool ffmpeg_init_video(ffmpeg_t *handle) static bool ffmpeg_init_config_common(struct ff_config_param *params, unsigned preset) { - char buf[256]; + settings_t *settings = config_get_ptr(); switch (preset) { case RECORD_CONFIG_TYPE_RECORDING_LOW_QUALITY: case RECORD_CONFIG_TYPE_STREAMING_LOW_QUALITY: - params->scale_factor = 1; params->threads = 1; params->frame_drop_ratio = 1; params->audio_enable = true; @@ -573,7 +572,6 @@ static bool ffmpeg_init_config_common(struct ff_config_param *params, unsigned p break; case RECORD_CONFIG_TYPE_RECORDING_MED_QUALITY: case RECORD_CONFIG_TYPE_STREAMING_MED_QUALITY: - params->scale_factor = 1; params->threads = 1; params->frame_drop_ratio = 1; params->audio_enable = true; @@ -590,7 +588,6 @@ static bool ffmpeg_init_config_common(struct ff_config_param *params, unsigned p break; case RECORD_CONFIG_TYPE_RECORDING_HIGH_QUALITY: case RECORD_CONFIG_TYPE_STREAMING_HIGH_QUALITY: - params->scale_factor = 1; params->threads = 1; params->frame_drop_ratio = 1; params->audio_enable = true; @@ -606,7 +603,6 @@ static bool ffmpeg_init_config_common(struct ff_config_param *params, unsigned p av_dict_set(¶ms->audio_opts, "audio_global_quality", "100", 0); break; case RECORD_CONFIG_TYPE_RECORDING_LOSSLESS_QUALITY: - params->scale_factor = 1; params->threads = 1; params->frame_drop_ratio = 1; params->audio_enable = true; @@ -622,7 +618,6 @@ static bool ffmpeg_init_config_common(struct ff_config_param *params, unsigned p av_dict_set(¶ms->audio_opts, "audio_global_quality", "100", 0); break; case RECORD_CONFIG_TYPE_STREAMING_NETPLAY: - params->scale_factor = 1; params->threads = 1; params->frame_drop_ratio = 1; params->audio_enable = true; @@ -642,11 +637,28 @@ static bool ffmpeg_init_config_common(struct ff_config_param *params, unsigned p } if (preset <= RECORD_CONFIG_TYPE_RECORDING_LOSSLESS_QUALITY) + { + if (!settings->bools.video_gpu_record) + params->scale_factor = settings->uints.video_record_scale_factor > 0 ? + settings->uints.video_record_scale_factor : 1; + else + params->scale_factor = 1; strlcpy(params->format, "matroska", sizeof(params->format)); + } else if (preset <= RECORD_CONFIG_TYPE_STREAMING_HIGH_QUALITY) + { + if (!settings->bools.video_gpu_record) + params->scale_factor = settings->uints.video_stream_scale_factor > 0 ? + settings->uints.video_stream_scale_factor : 1; + else + params->scale_factor = 1; strlcpy(params->format, "flv", sizeof(params->format)); + } else + { + params->scale_factor = 1; strlcpy(params->format, "flv", sizeof(params->format)); + } return true; }