mirror of
https://gitlab.com/GloriousEggroll/obs-studio-nobara.git
synced 2025-12-10 00:00:02 -05:00
rebase hevc vaapi patch
This commit is contained in:
@@ -1,11 +1,11 @@
|
|||||||
diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c b/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c
|
diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c b/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c
|
||||||
index 1598d39db..9b927a9e5 100644
|
index 53beb0f96..87338f61f 100644
|
||||||
--- a/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c
|
--- a/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c
|
||||||
+++ b/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c
|
+++ b/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c
|
||||||
@@ -72,10 +72,35 @@ struct vaapi_encoder {
|
@@ -74,10 +74,35 @@ struct vaapi_encoder {
|
||||||
bool initialized;
|
bool initialized;
|
||||||
};
|
};
|
||||||
|
|
||||||
-static const char *vaapi_getname(void *unused)
|
-static const char *vaapi_getname(void *unused)
|
||||||
+/* Identify codecs, and some default values */
|
+/* Identify codecs, and some default values */
|
||||||
+struct type_data {
|
+struct type_data {
|
||||||
@@ -21,7 +21,7 @@ index 1598d39db..9b927a9e5 100644
|
|||||||
+ .profile = FF_PROFILE_H264_CONSTRAINED_BASELINE,
|
+ .profile = FF_PROFILE_H264_CONSTRAINED_BASELINE,
|
||||||
+ .level = 40,
|
+ .level = 40,
|
||||||
+ .rate_control = "CBR",
|
+ .rate_control = "CBR",
|
||||||
+ .name = "FFMPEG VAAPI",
|
+ .name = "AMD/INTEL GPU VAAPI H.264 (via FFmpeg)",
|
||||||
+};
|
+};
|
||||||
+
|
+
|
||||||
+static struct type_data hevc_type = {
|
+static struct type_data hevc_type = {
|
||||||
@@ -29,22 +29,22 @@ index 1598d39db..9b927a9e5 100644
|
|||||||
+ .profile = FF_PROFILE_HEVC_MAIN,
|
+ .profile = FF_PROFILE_HEVC_MAIN,
|
||||||
+ .level = 120,
|
+ .level = 120,
|
||||||
+ .rate_control = "CBR",
|
+ .rate_control = "CBR",
|
||||||
+ .name = "FFMPEG VAAPI (hevc)",
|
+ .name = "AMD/INTEL GPU VAAPI H.265 (via FFmpeg)",
|
||||||
+};
|
+};
|
||||||
+
|
+
|
||||||
+static const char *vaapi_getname(void *type_data)
|
+static const char *vaapi_getname(void *type_data)
|
||||||
{
|
{
|
||||||
- UNUSED_PARAMETER(unused);
|
- UNUSED_PARAMETER(unused);
|
||||||
- return "FFMPEG VAAPI";
|
- return "FFMPEG VAAPI H.264";
|
||||||
+ struct type_data *data = type_data;
|
+ struct type_data *data = type_data;
|
||||||
+ return data->name;
|
+ return data->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool valid_format(enum video_format format)
|
static inline bool valid_format(enum video_format format)
|
||||||
@@ -173,15 +198,15 @@ typedef struct {
|
@@ -177,15 +202,15 @@ typedef struct {
|
||||||
bool maxrate;
|
bool maxrate;
|
||||||
} rc_mode_t;
|
} rc_mode_t;
|
||||||
|
|
||||||
+/* Set "allowed" options per Rate Control */
|
+/* Set "allowed" options per Rate Control */
|
||||||
+static const rc_mode_t RC_MODES[] = {
|
+static const rc_mode_t RC_MODES[] = {
|
||||||
+ {.name = "CBR", .qp = false, .bitrate = true, .maxrate = false},
|
+ {.name = "CBR", .qp = false, .bitrate = true, .maxrate = false},
|
||||||
@@ -62,17 +62,17 @@ index 1598d39db..9b927a9e5 100644
|
|||||||
- NULL};
|
- NULL};
|
||||||
-
|
-
|
||||||
const rc_mode_t *rc_mode = RC_MODES;
|
const rc_mode_t *rc_mode = RC_MODES;
|
||||||
|
|
||||||
while (!!rc_mode && strcmp(rc_mode->name, name) != 0)
|
while (!!rc_mode && strcmp(rc_mode->name, name) != 0)
|
||||||
@@ -281,6 +306,7 @@ static bool vaapi_update(void *data, obs_data_t *settings)
|
@@ -285,6 +310,7 @@ static bool vaapi_update(void *data, obs_data_t *settings)
|
||||||
|
|
||||||
info("settings:\n"
|
info("settings:\n"
|
||||||
"\tdevice: %s\n"
|
"\tdevice: %s\n"
|
||||||
+ "\tcodec: %s\n"
|
+ "\tcodec: %s\n"
|
||||||
"\trate_control: %s\n"
|
"\trate_control: %s\n"
|
||||||
"\tprofile: %d\n"
|
"\tprofile: %d\n"
|
||||||
"\tlevel: %d\n"
|
"\tlevel: %d\n"
|
||||||
@@ -291,9 +317,9 @@ static bool vaapi_update(void *data, obs_data_t *settings)
|
@@ -295,9 +321,9 @@ static bool vaapi_update(void *data, obs_data_t *settings)
|
||||||
"\twidth: %d\n"
|
"\twidth: %d\n"
|
||||||
"\theight: %d\n"
|
"\theight: %d\n"
|
||||||
"\tb-frames: %d\n",
|
"\tb-frames: %d\n",
|
||||||
@@ -82,25 +82,31 @@ index 1598d39db..9b927a9e5 100644
|
|||||||
+ device, enc->vaapi->name, rate_control, profile, level, qp,
|
+ device, enc->vaapi->name, rate_control, profile, level, qp,
|
||||||
+ bitrate, maxrate, enc->context->gop_size, enc->context->width,
|
+ bitrate, maxrate, enc->context->gop_size, enc->context->width,
|
||||||
+ enc->context->height, enc->context->max_b_frames);
|
+ enc->context->height, enc->context->max_b_frames);
|
||||||
|
|
||||||
return vaapi_init_codec(enc, device);
|
return vaapi_init_codec(enc, device);
|
||||||
}
|
}
|
||||||
@@ -347,9 +373,12 @@ static void *vaapi_create(obs_data_t *settings, obs_encoder_t *encoder)
|
@@ -350,10 +376,18 @@ static void *vaapi_create(obs_data_t *settings, obs_encoder_t *encoder)
|
||||||
|
|
||||||
if (vaapi_codec == AV_CODEC_ID_H264) {
|
enc = bzalloc(sizeof(*enc));
|
||||||
enc->vaapi = avcodec_find_encoder_by_name("h264_vaapi");
|
enc->encoder = encoder;
|
||||||
|
+
|
||||||
|
+ int vaapi_codec = (int)obs_data_get_int(settings, "vaapi_codec");
|
||||||
|
|
||||||
|
- enc->vaapi = avcodec_find_encoder_by_name("h264_vaapi");
|
||||||
|
+ if (vaapi_codec == AV_CODEC_ID_H264) {
|
||||||
|
+ enc->vaapi = avcodec_find_encoder_by_name("h264_vaapi");
|
||||||
+ enc->first_packet = true;
|
+ enc->first_packet = true;
|
||||||
+ }
|
+ }
|
||||||
|
|
||||||
|
- enc->first_packet = true;
|
||||||
+ if (vaapi_codec == AV_CODEC_ID_HEVC) {
|
+ if (vaapi_codec == AV_CODEC_ID_HEVC) {
|
||||||
+ enc->vaapi = avcodec_find_encoder_by_name("hevc_vaapi");
|
+ enc->vaapi = avcodec_find_encoder_by_name("hevc_vaapi");
|
||||||
+ enc->first_packet = false;
|
+ enc->first_packet = false;
|
||||||
}
|
+ }
|
||||||
-
|
|
||||||
- enc->first_packet = true;
|
|
||||||
|
|
||||||
blog(LOG_INFO, "---------------------------------");
|
blog(LOG_INFO, "---------------------------------");
|
||||||
|
|
||||||
@@ -485,7 +514,10 @@ static bool vaapi_encode(void *data, struct encoder_frame *frame,
|
@@ -488,7 +522,10 @@ static bool vaapi_encode(void *data, struct encoder_frame *frame,
|
||||||
packet->data = enc->buffer.array;
|
packet->data = enc->buffer.array;
|
||||||
packet->size = enc->buffer.num;
|
packet->size = enc->buffer.num;
|
||||||
packet->type = OBS_ENCODER_VIDEO;
|
packet->type = OBS_ENCODER_VIDEO;
|
||||||
@@ -108,14 +114,14 @@ index 1598d39db..9b927a9e5 100644
|
|||||||
+ packet->keyframe =
|
+ packet->keyframe =
|
||||||
+ enc->vaapi->id == AV_CODEC_ID_H264
|
+ enc->vaapi->id == AV_CODEC_ID_H264
|
||||||
+ ? obs_avc_keyframe(packet->data, packet->size)
|
+ ? obs_avc_keyframe(packet->data, packet->size)
|
||||||
+ : av_pkt.flags & AV_PKT_FLAG_KEY;
|
+ : enc->packet->flags & AV_PKT_FLAG_KEY;
|
||||||
*received_packet = true;
|
*received_packet = true;
|
||||||
} else {
|
} else {
|
||||||
*received_packet = false;
|
*received_packet = false;
|
||||||
@@ -506,19 +538,20 @@ static void set_visible(obs_properties_t *ppts, const char *name, bool visible)
|
@@ -509,18 +546,20 @@ static void set_visible(obs_properties_t *ppts, const char *name, bool visible)
|
||||||
obs_property_set_visible(p, visible);
|
obs_property_set_visible(p, visible);
|
||||||
}
|
}
|
||||||
|
|
||||||
-static void vaapi_defaults(obs_data_t *settings)
|
-static void vaapi_defaults(obs_data_t *settings)
|
||||||
+static void vaapi_defaults(obs_data_t *settings, void *type_data)
|
+static void vaapi_defaults(obs_data_t *settings, void *type_data)
|
||||||
{
|
{
|
||||||
@@ -123,7 +129,6 @@ index 1598d39db..9b927a9e5 100644
|
|||||||
+
|
+
|
||||||
obs_data_set_default_string(settings, "vaapi_device",
|
obs_data_set_default_string(settings, "vaapi_device",
|
||||||
"/dev/dri/renderD128");
|
"/dev/dri/renderD128");
|
||||||
- obs_data_set_default_int(settings, "vaapi_codec", AV_CODEC_ID_H264);
|
|
||||||
- obs_data_set_default_int(settings, "profile",
|
- obs_data_set_default_int(settings, "profile",
|
||||||
- FF_PROFILE_H264_CONSTRAINED_BASELINE);
|
- FF_PROFILE_H264_CONSTRAINED_BASELINE);
|
||||||
- obs_data_set_default_int(settings, "level", 40);
|
- obs_data_set_default_int(settings, "level", 40);
|
||||||
@@ -140,10 +145,10 @@ index 1598d39db..9b927a9e5 100644
|
|||||||
obs_data_set_default_int(settings, "qp", 20);
|
obs_data_set_default_int(settings, "qp", 20);
|
||||||
obs_data_set_default_int(settings, "maxrate", 0);
|
obs_data_set_default_int(settings, "maxrate", 0);
|
||||||
}
|
}
|
||||||
@@ -566,9 +599,13 @@ static bool get_device_name_from_pci(struct pci_access *pacc, char *pci_slot,
|
@@ -568,9 +607,13 @@ static bool get_device_name_from_pci(struct pci_access *pacc, char *pci_slot,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
-static obs_properties_t *vaapi_properties(void *unused)
|
-static obs_properties_t *vaapi_properties(void *unused)
|
||||||
+static obs_properties_t *vaapi_properties(void *unused, void *type_data)
|
+static obs_properties_t *vaapi_properties(void *unused, void *type_data)
|
||||||
{
|
{
|
||||||
@@ -152,20 +157,13 @@ index 1598d39db..9b927a9e5 100644
|
|||||||
+ struct dstr name;
|
+ struct dstr name;
|
||||||
+
|
+
|
||||||
+ dstr_init(&name);
|
+ dstr_init(&name);
|
||||||
|
|
||||||
obs_properties_t *props = obs_properties_create();
|
obs_properties_t *props = obs_properties_create();
|
||||||
obs_property_t *list;
|
obs_property_t *list;
|
||||||
@@ -632,40 +669,63 @@ static obs_properties_t *vaapi_properties(void *unused)
|
@@ -642,33 +685,63 @@ static obs_properties_t *vaapi_properties(void *unused)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- list = obs_properties_add_list(props, "vaapi_codec",
|
|
||||||
- obs_module_text("VAAPI.Codec"),
|
|
||||||
- OBS_COMBO_TYPE_LIST,
|
|
||||||
- OBS_COMBO_FORMAT_INT);
|
|
||||||
-
|
|
||||||
- obs_property_list_add_int(list, "H.264 (default)", AV_CODEC_ID_H264);
|
|
||||||
-
|
|
||||||
- list = obs_properties_add_list(props, "profile",
|
- list = obs_properties_add_list(props, "profile",
|
||||||
- obs_module_text("Profile"),
|
- obs_module_text("Profile"),
|
||||||
- OBS_COMBO_TYPE_LIST,
|
- OBS_COMBO_TYPE_LIST,
|
||||||
@@ -174,25 +172,6 @@ index 1598d39db..9b927a9e5 100644
|
|||||||
- FF_PROFILE_H264_CONSTRAINED_BASELINE);
|
- FF_PROFILE_H264_CONSTRAINED_BASELINE);
|
||||||
- obs_property_list_add_int(list, "Main", FF_PROFILE_H264_MAIN);
|
- obs_property_list_add_int(list, "Main", FF_PROFILE_H264_MAIN);
|
||||||
- obs_property_list_add_int(list, "High", FF_PROFILE_H264_HIGH);
|
- obs_property_list_add_int(list, "High", FF_PROFILE_H264_HIGH);
|
||||||
-
|
|
||||||
- list = obs_properties_add_list(props, "level", obs_module_text("Level"),
|
|
||||||
- OBS_COMBO_TYPE_LIST,
|
|
||||||
- OBS_COMBO_FORMAT_INT);
|
|
||||||
- obs_property_list_add_int(list, "Auto", FF_LEVEL_UNKNOWN);
|
|
||||||
- obs_property_list_add_int(list, "3.0", 30);
|
|
||||||
- obs_property_list_add_int(list, "3.1", 31);
|
|
||||||
- obs_property_list_add_int(list, "4.0 (default) (Compatibility mode)",
|
|
||||||
- 40);
|
|
||||||
- obs_property_list_add_int(list, "4.1", 41);
|
|
||||||
- obs_property_list_add_int(list, "4.2", 42);
|
|
||||||
- obs_property_list_add_int(list, "5.0", 50);
|
|
||||||
- obs_property_list_add_int(list, "5.1", 51);
|
|
||||||
- obs_property_list_add_int(list, "5.2", 52);
|
|
||||||
-
|
|
||||||
- list = obs_properties_add_list(props, "rate_control",
|
|
||||||
- obs_module_text("RateControl"),
|
|
||||||
- OBS_COMBO_TYPE_LIST,
|
|
||||||
- OBS_COMBO_FORMAT_STRING);
|
|
||||||
+ if (codec->id == AV_CODEC_ID_H264) {
|
+ if (codec->id == AV_CODEC_ID_H264) {
|
||||||
+ list = obs_properties_add_list(props, "profile",
|
+ list = obs_properties_add_list(props, "profile",
|
||||||
+ obs_module_text("Profile"),
|
+ obs_module_text("Profile"),
|
||||||
@@ -245,7 +224,25 @@ index 1598d39db..9b927a9e5 100644
|
|||||||
+ obs_property_list_add_int(list, "6.1", 183);
|
+ obs_property_list_add_int(list, "6.1", 183);
|
||||||
+ obs_property_list_add_int(list, "6.2", 186);
|
+ obs_property_list_add_int(list, "6.2", 186);
|
||||||
+ }
|
+ }
|
||||||
+
|
|
||||||
|
- list = obs_properties_add_list(props, "level", obs_module_text("Level"),
|
||||||
|
- OBS_COMBO_TYPE_LIST,
|
||||||
|
- OBS_COMBO_FORMAT_INT);
|
||||||
|
- obs_property_list_add_int(list, "Auto", FF_LEVEL_UNKNOWN);
|
||||||
|
- obs_property_list_add_int(list, "3.0", 30);
|
||||||
|
- obs_property_list_add_int(list, "3.1", 31);
|
||||||
|
- obs_property_list_add_int(list, "4.0 (default) (Compatibility mode)",
|
||||||
|
- 40);
|
||||||
|
- obs_property_list_add_int(list, "4.1", 41);
|
||||||
|
- obs_property_list_add_int(list, "4.2", 42);
|
||||||
|
- obs_property_list_add_int(list, "5.0", 50);
|
||||||
|
- obs_property_list_add_int(list, "5.1", 51);
|
||||||
|
- obs_property_list_add_int(list, "5.2", 52);
|
||||||
|
-
|
||||||
|
- list = obs_properties_add_list(props, "rate_control",
|
||||||
|
- obs_module_text("RateControl"),
|
||||||
|
- OBS_COMBO_TYPE_LIST,
|
||||||
|
- OBS_COMBO_FORMAT_STRING);
|
||||||
+ list = obs_properties_add_list(props, "rate_control",
|
+ list = obs_properties_add_list(props, "rate_control",
|
||||||
+ obs_module_text("RateControl"),
|
+ obs_module_text("RateControl"),
|
||||||
+ OBS_COMBO_TYPE_LIST,
|
+ OBS_COMBO_TYPE_LIST,
|
||||||
@@ -253,15 +250,15 @@ index 1598d39db..9b927a9e5 100644
|
|||||||
obs_property_list_add_string(list, "CBR (default)", "CBR");
|
obs_property_list_add_string(list, "CBR (default)", "CBR");
|
||||||
obs_property_list_add_string(list, "CQP", "CQP");
|
obs_property_list_add_string(list, "CQP", "CQP");
|
||||||
obs_property_list_add_string(list, "VBR", "VBR");
|
obs_property_list_add_string(list, "VBR", "VBR");
|
||||||
@@ -687,6 +747,7 @@ static obs_properties_t *vaapi_properties(void *unused)
|
@@ -691,6 +764,7 @@ static obs_properties_t *vaapi_properties(void *unused)
|
||||||
obs_module_text("KeyframeIntervalSec"), 0, 20,
|
20, 1);
|
||||||
1);
|
obs_property_int_set_suffix(p, " s");
|
||||||
|
|
||||||
+ dstr_free(&name);
|
+ dstr_free(&name);
|
||||||
return props;
|
return props;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -716,11 +777,28 @@ struct obs_encoder_info vaapi_encoder_info = {
|
@@ -720,11 +794,28 @@ struct obs_encoder_info vaapi_encoder_info = {
|
||||||
.create = vaapi_create,
|
.create = vaapi_create,
|
||||||
.destroy = vaapi_destroy,
|
.destroy = vaapi_destroy,
|
||||||
.encode = vaapi_encode,
|
.encode = vaapi_encode,
|
||||||
@@ -290,35 +287,35 @@ index 1598d39db..9b927a9e5 100644
|
|||||||
.get_video_info = vaapi_video_info,
|
.get_video_info = vaapi_video_info,
|
||||||
+ .type_data = &hevc_type,
|
+ .type_data = &hevc_type,
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
diff --git a/plugins/obs-ffmpeg/obs-ffmpeg.c b/plugins/obs-ffmpeg/obs-ffmpeg.c
|
diff --git a/plugins/obs-ffmpeg/obs-ffmpeg.c b/plugins/obs-ffmpeg/obs-ffmpeg.c
|
||||||
index b25201572..84594f2b6 100644
|
index 1d1131d13..382958c7b 100644
|
||||||
--- a/plugins/obs-ffmpeg/obs-ffmpeg.c
|
--- a/plugins/obs-ffmpeg/obs-ffmpeg.c
|
||||||
+++ b/plugins/obs-ffmpeg/obs-ffmpeg.c
|
+++ b/plugins/obs-ffmpeg/obs-ffmpeg.c
|
||||||
@@ -37,6 +37,7 @@ extern struct obs_encoder_info aom_av1_encoder_info;
|
@@ -40,6 +40,7 @@ extern struct obs_encoder_info aom_av1_encoder_info;
|
||||||
|
|
||||||
#ifdef LIBAVUTIL_VAAPI_AVAILABLE
|
#ifdef LIBAVUTIL_VAAPI_AVAILABLE
|
||||||
extern struct obs_encoder_info vaapi_encoder_info;
|
extern struct obs_encoder_info vaapi_encoder_info;
|
||||||
+extern struct obs_encoder_info vaapi_hevc_encoder_info;
|
+extern struct obs_encoder_info vaapi_hevc_encoder_info;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef __APPLE__
|
#ifndef __APPLE__
|
||||||
@@ -215,9 +216,9 @@ finish:
|
@@ -284,9 +285,9 @@ static bool nvenc_supported(bool *out_h264, bool *out_hevc)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LIBAVUTIL_VAAPI_AVAILABLE
|
#ifdef LIBAVUTIL_VAAPI_AVAILABLE
|
||||||
-static bool vaapi_supported(void)
|
-static bool vaapi_supported(void)
|
||||||
+static bool vaapi_supported(const char *codec_name)
|
+static bool vaapi_supported(const char *codec_name)
|
||||||
{
|
{
|
||||||
- AVCodec *vaenc = avcodec_find_encoder_by_name("h264_vaapi");
|
- const AVCodec *vaenc = avcodec_find_encoder_by_name("h264_vaapi");
|
||||||
+ AVCodec *vaenc = avcodec_find_encoder_by_name(codec_name);
|
+ const AVCodec *vaenc = avcodec_find_encoder_by_name(codec_name);
|
||||||
return !!vaenc;
|
return !!vaenc;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -269,9 +270,13 @@ bool obs_module_load(void)
|
@@ -361,9 +362,13 @@ bool obs_module_load(void)
|
||||||
obs_register_encoder(&nvenc_encoder_info);
|
#endif
|
||||||
}
|
|
||||||
#if !defined(_WIN32) && defined(LIBAVUTIL_VAAPI_AVAILABLE)
|
#if !defined(_WIN32) && defined(LIBAVUTIL_VAAPI_AVAILABLE)
|
||||||
- if (vaapi_supported()) {
|
- if (vaapi_supported()) {
|
||||||
- blog(LOG_INFO, "FFMPEG VAAPI supported");
|
- blog(LOG_INFO, "FFMPEG VAAPI supported");
|
||||||
@@ -333,4 +330,3 @@ index b25201572..84594f2b6 100644
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Reference in New Issue
Block a user