diff --git a/hevc-vaapi.diff b/hevc-vaapi.patch similarity index 85% rename from hevc-vaapi.diff rename to hevc-vaapi.patch index b76e6c3..042ac98 100644 --- a/hevc-vaapi.diff +++ b/hevc-vaapi.patch @@ -1,11 +1,11 @@ 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 +++ b/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c -@@ -72,10 +72,35 @@ struct vaapi_encoder { +@@ -74,10 +74,35 @@ struct vaapi_encoder { bool initialized; }; - + -static const char *vaapi_getname(void *unused) +/* Identify codecs, and some default values */ +struct type_data { @@ -21,7 +21,7 @@ index 1598d39db..9b927a9e5 100644 + .profile = FF_PROFILE_H264_CONSTRAINED_BASELINE, + .level = 40, + .rate_control = "CBR", -+ .name = "FFMPEG VAAPI", ++ .name = "AMD/INTEL GPU VAAPI H.264 (via FFmpeg)", +}; + +static struct type_data hevc_type = { @@ -29,22 +29,22 @@ index 1598d39db..9b927a9e5 100644 + .profile = FF_PROFILE_HEVC_MAIN, + .level = 120, + .rate_control = "CBR", -+ .name = "FFMPEG VAAPI (hevc)", ++ .name = "AMD/INTEL GPU VAAPI H.265 (via FFmpeg)", +}; + +static const char *vaapi_getname(void *type_data) { - UNUSED_PARAMETER(unused); -- return "FFMPEG VAAPI"; +- return "FFMPEG VAAPI H.264"; + struct type_data *data = type_data; + return data->name; } - + static inline bool valid_format(enum video_format format) -@@ -173,15 +198,15 @@ typedef struct { +@@ -177,15 +202,15 @@ typedef struct { bool maxrate; } rc_mode_t; - + +/* Set "allowed" options per Rate Control */ +static const rc_mode_t RC_MODES[] = { + {.name = "CBR", .qp = false, .bitrate = true, .maxrate = false}, @@ -62,17 +62,17 @@ index 1598d39db..9b927a9e5 100644 - NULL}; - const rc_mode_t *rc_mode = RC_MODES; - + 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" "\tdevice: %s\n" + "\tcodec: %s\n" "\trate_control: %s\n" "\tprofile: %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" "\theight: %d\n" "\tb-frames: %d\n", @@ -82,25 +82,31 @@ index 1598d39db..9b927a9e5 100644 + device, enc->vaapi->name, rate_control, profile, level, qp, + bitrate, maxrate, enc->context->gop_size, enc->context->width, + enc->context->height, enc->context->max_b_frames); - + return vaapi_init_codec(enc, device); } -@@ -347,9 +373,12 @@ static void *vaapi_create(obs_data_t *settings, obs_encoder_t *encoder) - - if (vaapi_codec == AV_CODEC_ID_H264) { - enc->vaapi = avcodec_find_encoder_by_name("h264_vaapi"); +@@ -350,10 +376,18 @@ static void *vaapi_create(obs_data_t *settings, obs_encoder_t *encoder) + + enc = bzalloc(sizeof(*enc)); + 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; + if (vaapi_codec == AV_CODEC_ID_HEVC) { + enc->vaapi = avcodec_find_encoder_by_name("hevc_vaapi"); + enc->first_packet = false; - } -- -- enc->first_packet = true; - ++ } + 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->size = enc->buffer.num; packet->type = OBS_ENCODER_VIDEO; @@ -108,14 +114,14 @@ index 1598d39db..9b927a9e5 100644 + packet->keyframe = + enc->vaapi->id == AV_CODEC_ID_H264 + ? obs_avc_keyframe(packet->data, packet->size) -+ : av_pkt.flags & AV_PKT_FLAG_KEY; ++ : enc->packet->flags & AV_PKT_FLAG_KEY; *received_packet = true; } else { *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); } - + -static void vaapi_defaults(obs_data_t *settings) +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", "/dev/dri/renderD128"); -- obs_data_set_default_int(settings, "vaapi_codec", AV_CODEC_ID_H264); - obs_data_set_default_int(settings, "profile", - FF_PROFILE_H264_CONSTRAINED_BASELINE); - 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, "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; } - + -static obs_properties_t *vaapi_properties(void *unused) +static obs_properties_t *vaapi_properties(void *unused, void *type_data) { @@ -152,20 +157,13 @@ index 1598d39db..9b927a9e5 100644 + struct dstr name; + + dstr_init(&name); - + obs_properties_t *props = obs_properties_create(); 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", - obs_module_text("Profile"), - OBS_COMBO_TYPE_LIST, @@ -174,25 +172,6 @@ index 1598d39db..9b927a9e5 100644 - FF_PROFILE_H264_CONSTRAINED_BASELINE); - obs_property_list_add_int(list, "Main", FF_PROFILE_H264_MAIN); - 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) { + list = obs_properties_add_list(props, "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.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", + obs_module_text("RateControl"), + 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, "CQP", "CQP"); obs_property_list_add_string(list, "VBR", "VBR"); -@@ -687,6 +747,7 @@ static obs_properties_t *vaapi_properties(void *unused) - obs_module_text("KeyframeIntervalSec"), 0, 20, - 1); - +@@ -691,6 +764,7 @@ static obs_properties_t *vaapi_properties(void *unused) + 20, 1); + obs_property_int_set_suffix(p, " s"); + + dstr_free(&name); 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, .destroy = vaapi_destroy, .encode = vaapi_encode, @@ -290,35 +287,35 @@ index 1598d39db..9b927a9e5 100644 .get_video_info = vaapi_video_info, + .type_data = &hevc_type, }; - + #endif 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 +++ 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 extern struct obs_encoder_info vaapi_encoder_info; +extern struct obs_encoder_info vaapi_hevc_encoder_info; #endif - + #ifndef __APPLE__ -@@ -215,9 +216,9 @@ finish: +@@ -284,9 +285,9 @@ static bool nvenc_supported(bool *out_h264, bool *out_hevc) #endif - + #ifdef LIBAVUTIL_VAAPI_AVAILABLE -static bool vaapi_supported(void) +static bool vaapi_supported(const char *codec_name) { -- 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("h264_vaapi"); ++ const AVCodec *vaenc = avcodec_find_encoder_by_name(codec_name); return !!vaenc; } #endif -@@ -269,9 +270,13 @@ bool obs_module_load(void) - obs_register_encoder(&nvenc_encoder_info); - } +@@ -361,9 +362,13 @@ bool obs_module_load(void) + #endif + #if !defined(_WIN32) && defined(LIBAVUTIL_VAAPI_AVAILABLE) - if (vaapi_supported()) { - blog(LOG_INFO, "FFMPEG VAAPI supported"); @@ -333,4 +330,3 @@ index b25201572..84594f2b6 100644 } #endif #endif -