mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-09-24 23:31:36 +08:00
obs-ffmpeg: Add lossless mode to NVENC encoder
This commit is contained in:
@@ -13,6 +13,8 @@ NVENC.Preset.bd="Bluray"
|
|||||||
NVENC.Preset.ll="Low-Latency"
|
NVENC.Preset.ll="Low-Latency"
|
||||||
NVENC.Preset.llhq="Low-Latency High Quality"
|
NVENC.Preset.llhq="Low-Latency High Quality"
|
||||||
NVENC.Preset.llhp="Low-Latency High Performance"
|
NVENC.Preset.llhp="Low-Latency High Performance"
|
||||||
|
NVENC.Preset.lossless="Lossless"
|
||||||
|
NVENC.Preset.losslesshp="Lossless High Performance"
|
||||||
NVENC.Level="Level"
|
NVENC.Level="Level"
|
||||||
|
|
||||||
FFmpegSource="Media Source"
|
FFmpegSource="Media Source"
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#include <util/darray.h>
|
#include <util/darray.h>
|
||||||
|
#include <util/dstr.h>
|
||||||
#include <util/base.h>
|
#include <util/base.h>
|
||||||
#include <media-io/video-io.h>
|
#include <media-io/video-io.h>
|
||||||
#include <obs-module.h>
|
#include <obs-module.h>
|
||||||
@@ -140,13 +141,20 @@ static bool nvenc_update(void *data, obs_data_t *settings)
|
|||||||
nvenc_video_info(enc, &info);
|
nvenc_video_info(enc, &info);
|
||||||
|
|
||||||
av_opt_set(enc->context->priv_data, "preset", preset, 0);
|
av_opt_set(enc->context->priv_data, "preset", preset, 0);
|
||||||
av_opt_set(enc->context->priv_data, "profile", profile, 0);
|
|
||||||
av_opt_set(enc->context->priv_data, "level", level, 0);
|
av_opt_set(enc->context->priv_data, "level", level, 0);
|
||||||
av_opt_set_int(enc->context->priv_data, "cbr", cbr, 0);
|
|
||||||
av_opt_set_int(enc->context->priv_data, "2pass", twopass, 0);
|
av_opt_set_int(enc->context->priv_data, "2pass", twopass, 0);
|
||||||
av_opt_set_int(enc->context->priv_data, "gpu", gpu, 0);
|
av_opt_set_int(enc->context->priv_data, "gpu", gpu, 0);
|
||||||
|
|
||||||
enc->context->bit_rate = bitrate * 1000;
|
if (astrcmp_n(preset, "lossless", 8) == 0) {
|
||||||
|
enc->context->bit_rate = 0;
|
||||||
|
bitrate = 0;
|
||||||
|
} else {
|
||||||
|
enc->context->bit_rate = bitrate * 1000;
|
||||||
|
|
||||||
|
av_opt_set(enc->context->priv_data, "profile", profile, 0);
|
||||||
|
av_opt_set_int(enc->context->priv_data, "cbr", cbr, 0);
|
||||||
|
}
|
||||||
|
|
||||||
enc->context->width = obs_encoder_get_width(enc->encoder);
|
enc->context->width = obs_encoder_get_width(enc->encoder);
|
||||||
enc->context->height = obs_encoder_get_height(enc->encoder);
|
enc->context->height = obs_encoder_get_height(enc->encoder);
|
||||||
enc->context->time_base = (AVRational){voi->fps_den, voi->fps_num};
|
enc->context->time_base = (AVRational){voi->fps_den, voi->fps_num};
|
||||||
@@ -321,6 +329,16 @@ static void nvenc_defaults(obs_data_t *settings)
|
|||||||
obs_data_set_default_int(settings, "gpu", 0);
|
obs_data_set_default_int(settings, "gpu", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool preset_modified(obs_properties_t *props, obs_property_t *p,
|
||||||
|
obs_data_t *settings)
|
||||||
|
{
|
||||||
|
const char *preset = obs_data_get_string(settings, "preset");
|
||||||
|
bool lossless = preset && astrcmp_n(preset, "lossless", 8) == 0;
|
||||||
|
p = obs_properties_get(props, "bitrate");
|
||||||
|
obs_property_set_visible(p, !lossless);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static obs_properties_t *nvenc_properties(void *unused)
|
static obs_properties_t *nvenc_properties(void *unused)
|
||||||
{
|
{
|
||||||
UNUSED_PARAMETER(unused);
|
UNUSED_PARAMETER(unused);
|
||||||
@@ -347,8 +365,12 @@ static obs_properties_t *nvenc_properties(void *unused)
|
|||||||
add_preset("ll");
|
add_preset("ll");
|
||||||
add_preset("llhq");
|
add_preset("llhq");
|
||||||
add_preset("llhp");
|
add_preset("llhp");
|
||||||
|
add_preset("lossless");
|
||||||
|
add_preset("losslesshp");
|
||||||
#undef add_preset
|
#undef add_preset
|
||||||
|
|
||||||
|
obs_property_set_modified_callback(p, preset_modified);
|
||||||
|
|
||||||
p = obs_properties_add_list(props, "profile", obs_module_text("Profile"),
|
p = obs_properties_add_list(props, "profile", obs_module_text("Profile"),
|
||||||
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
|
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user