$ git diff --patch-with-stat --summary 126cd9db54816d2ba3978ad367fa42033837c210..48660cc0bea4687d9a138a3f909b952a0a0e5f1c
.abf.yml | 2 +-
hevc-vaapi.diff | 316 ++++++++++++++++++++++++++
obs-studio-21.0.3-linkage.patch | 16 --
obs-studio-22.0.2-linkage.patch | 25 --
obs-studio-25.0.3-fix-compiler-warnings.patch | 23 --
obs-studio-26.0.0-rc1-linkage.patch | 24 ++
obs-studio.spec | 9 +-
7 files changed, 345 insertions(+), 70 deletions(-)
create mode 100644 hevc-vaapi.diff
delete mode 100644 obs-studio-21.0.3-linkage.patch
delete mode 100644 obs-studio-22.0.2-linkage.patch
delete mode 100644 obs-studio-25.0.3-fix-compiler-warnings.patch
create mode 100644 obs-studio-26.0.0-rc1-linkage.patch
diff --git a/.abf.yml b/.abf.yml
index 1bc02cc..ddce687 100644
--- a/.abf.yml
+++ b/.abf.yml
@@ -1,2 +1,2 @@
sources:
- obs-studio-25.0.7.tar.gz: 0c504750e90c1714c7343f3514d7075da9e18060
+ obs-studio-26.1.1.tar.gz: ecf7b814bc42e355e56fcf3f79d13ca0389689f2
diff --git a/hevc-vaapi.diff b/hevc-vaapi.diff
new file mode 100644
index 0000000..6fa8fc8
--- /dev/null
+++ b/hevc-vaapi.diff
@@ -0,0 +1,316 @@
+diff -up obs-studio-26.0.2/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c.2~ obs-studio-26.0.2/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
+diff -up obs-studio-26.0.2/plugins/obs-ffmpeg/obs-ffmpeg.c.2~ obs-studio-26.0.2/plugins/obs-ffmpeg/obs-ffmpeg.c
+--- obs-studio-26.0.2/plugins/obs-ffmpeg/obs-ffmpeg.c.2~ 2020-10-06 17:49:58.000000000 +0200
++++ obs-studio-26.0.2/plugins/obs-ffmpeg/obs-ffmpeg.c 2020-11-07 23:45:11.765373302 +0100
+@@ -34,6 +34,7 @@ extern struct obs_encoder_info nvenc_enc
+
+ #ifdef LIBAVUTIL_VAAPI_AVAILABLE
+ extern struct obs_encoder_info vaapi_encoder_info;
++extern struct obs_encoder_info vaapi_hevc_encoder_info;
+ #endif
+
+ #ifndef __APPLE__
+@@ -208,9 +209,9 @@ finish:
+ #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);
+ return !!vaenc;
+ }
+ #endif
+@@ -250,10 +251,14 @@ bool obs_module_load(void)
+ obs_register_encoder(&nvenc_encoder_info);
+ }
+ #if !defined(_WIN32) && defined(LIBAVUTIL_VAAPI_AVAILABLE)
+- if (vaapi_supported()) {
++ if (vaapi_supported("h264_vaapi")) {
+ blog(LOG_INFO, "FFMPEG VAAPI supported");
+ obs_register_encoder(&vaapi_encoder_info);
+ }
++ if (vaapi_supported("hevc_vaapi")) {
++ blog(LOG_INFO, "FFMPEG HEVC VAAPI supported");
++ obs_register_encoder(&vaapi_hevc_encoder_info);
++ }
+ #endif
+ #endif
+
+diff -up obs-studio-26.0.2/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c.2~ obs-studio-26.0.2/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c
+--- obs-studio-26.0.2/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c.2~ 2020-10-06 17:49:58.000000000 +0200
++++ obs-studio-26.0.2/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c 2020-11-07 23:45:11.764373289 +0100
+@@ -69,10 +69,35 @@ struct vaapi_encoder {
+ bool initialized;
+ };
+
+-static const char *vaapi_getname(void *unused)
++/* Identify codecs, and some default values */
++struct type_data {
++ const int id;
++ const int profile;
++ const int level;
++ const char *name;
++ const char *rate_control;
++};
++
++static struct type_data h264_type = {
++ .id = AV_CODEC_ID_H264,
++ .profile = FF_PROFILE_H264_CONSTRAINED_BASELINE,
++ .level = 40,
++ .rate_control = "CBR",
++ .name = "FFMPEG VAAPI",
++};
++
++static struct type_data hevc_type = {
++ .id = AV_CODEC_ID_HEVC,
++ .profile = FF_PROFILE_HEVC_MAIN,
++ .level = 0,
++ .name = "FFMPEG VAAPI (hevc)",
++ .rate_control = "CQP",
++};
++
++static const char *vaapi_getname(void *type_data)
+ {
+- UNUSED_PARAMETER(unused);
+- return "FFMPEG VAAPI";
++ struct type_data *data = type_data;
++ return data->name;
+ }
+
+ static inline bool valid_format(enum video_format format)
+@@ -170,21 +195,21 @@ 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},
++ {.name = "CQP", .qp = true, .bitrate = false, .maxrate = false},
++ {.name = "VBR", .qp = false, .bitrate = true, .maxrate = true},
++ NULL};
++
+ static const rc_mode_t *get_rc_mode(const char *name)
+ {
+- /* Set "allowed" options per Rate Control */
+- static const rc_mode_t RC_MODES[] = {
+- {.name = "CBR", .qp = false, .bitrate = true, .maxrate = false},
+- {.name = "CQP", .qp = true, .bitrate = false, .maxrate = false},
+- {.name = "VBR", .qp = false, .bitrate = true, .maxrate = true},
+- NULL};
+-
+ const rc_mode_t *rc_mode = RC_MODES;
+
+- while (!!rc_mode && strcmp(rc_mode->name, name) != 0)
++ while (!!rc_mode->name && strcmp(rc_mode->name, name) != 0)
+ rc_mode++;
+
+- return rc_mode ? rc_mode : RC_MODES;
++ return !!rc_mode->name ? rc_mode : RC_MODES;
+ }
+
+ static bool vaapi_update(void *data, obs_data_t *settings)
+@@ -278,6 +303,7 @@ static bool vaapi_update(void *data, obs
+
+ info("settings:\n"
+ "\tdevice: %s\n"
++ "\tcodec: %s\n"
+ "\trate_control: %s\n"
+ "\tprofile: %d\n"
+ "\tlevel: %d\n"
+@@ -288,9 +314,9 @@ static bool vaapi_update(void *data, obs
+ "\twidth: %d\n"
+ "\theight: %d\n"
+ "\tb-frames: %d\n",
+- device, rate_control, profile, level, qp, bitrate, maxrate,
+- enc->context->gop_size, enc->context->width, enc->context->height,
+- enc->context->max_b_frames);
++ 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);
+ }
+@@ -344,9 +370,12 @@ static void *vaapi_create(obs_data_t *se
+
+ if (vaapi_codec == AV_CODEC_ID_H264) {
+ enc->vaapi = avcodec_find_encoder_by_name("h264_vaapi");
++ 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, "---------------------------------");
+
+@@ -482,7 +511,10 @@ static bool vaapi_encode(void *data, str
+ packet->data = enc->buffer.array;
+ packet->size = enc->buffer.num;
+ packet->type = OBS_ENCODER_VIDEO;
+- packet->keyframe = obs_avc_keyframe(packet->data, packet->size);
++ packet->keyframe =
++ enc->vaapi->id == AV_CODEC_ID_H264
++ ? obs_avc_keyframe(packet->data, packet->size)
++ : av_pkt.flags & AV_PKT_FLAG_KEY;
+ *received_packet = true;
+ } else {
+ *received_packet = false;
+@@ -503,19 +535,20 @@ static void set_visible(obs_properties_t
+ 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)
+ {
++ struct type_data *codec = type_data;
++
+ 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);
++ obs_data_set_default_int(settings, "vaapi_codec", codec->id);
++ obs_data_set_default_int(settings, "profile", codec->profile);
++ obs_data_set_default_int(settings, "level", codec->level);
+ obs_data_set_default_int(settings, "bitrate", 2500);
+ obs_data_set_default_int(settings, "keyint_sec", 0);
+ obs_data_set_default_int(settings, "bf", 0);
+- obs_data_set_default_int(settings, "rendermode", 0);
+- obs_data_set_default_string(settings, "rate_control", "CBR");
++ obs_data_set_default_string(settings, "rate_control",
++ codec->rate_control);
+ obs_data_set_default_int(settings, "qp", 20);
+ obs_data_set_default_int(settings, "maxrate", 0);
+ }
+@@ -538,9 +571,13 @@ static bool rate_control_modified(obs_pr
+ return true;
+ }
+
+-static obs_properties_t *vaapi_properties(void *unused)
++static obs_properties_t *vaapi_properties(void *unused, void *type_data)
+ {
+ UNUSED_PARAMETER(unused);
++ struct type_data *codec = type_data;
++ struct dstr name;
++
++ dstr_init(&name);
+
+ obs_properties_t *props = obs_properties_create();
+ obs_property_t *list;
+@@ -560,41 +597,44 @@ static obs_properties_t *vaapi_propertie
+ }
+ }
+
+- list = obs_properties_add_list(props, "vaapi_codec", "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", "Profile",
+- OBS_COMBO_TYPE_LIST,
+- OBS_COMBO_FORMAT_INT);
+- obs_property_list_add_int(list, "Constrained Baseline (default)",
+- 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", "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);
++ if (codec->id == AV_CODEC_ID_H264) {
++ list = obs_properties_add_list(props, "profile", "Profile",
++ OBS_COMBO_TYPE_LIST,
++ OBS_COMBO_FORMAT_INT);
++ obs_property_list_add_int(list, "Constrained Baseline (default)",
++ 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", "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);
+- 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");
++
++ for (const rc_mode_t *rc_mode = RC_MODES; !!rc_mode->name; rc_mode++) {
++ /* Identify the default choice */
++ char *def = strcmp(rc_mode->name, codec->rate_control) == 0
++ ? " (default)"
++ : "";
++
++ dstr_printf(&name, "%s%s", rc_mode->name, def);
++ obs_property_list_add_string(list, name.array, rc_mode->name);
++ }
+
+ obs_property_set_modified_callback(list, rate_control_modified);
+
+@@ -613,6 +653,7 @@ static obs_properties_t *vaapi_propertie
+ obs_module_text("KeyframeIntervalSec"), 0, 20,
+ 1);
+
++ dstr_free(&name);
+ return props;
+ }
+
+@@ -642,11 +683,26 @@ struct obs_encoder_info vaapi_encoder_in
+ .create = vaapi_create,
+ .destroy = vaapi_destroy,
+ .encode = vaapi_encode,
+- .get_defaults = vaapi_defaults,
+- .get_properties = vaapi_properties,
++ .get_defaults2 = vaapi_defaults,
++ .get_properties2 = vaapi_properties,
+ .get_extra_data = vaapi_extra_data,
+ .get_sei_data = vaapi_sei_data,
+ .get_video_info = vaapi_video_info,
++ .type_data = &h264_type,
++};
++
++struct obs_encoder_info vaapi_hevc_encoder_info = {
++ .id = "ffmpeg_vaapi_hevc",
++ .type = OBS_ENCODER_VIDEO,
++ .codec = "hevc",
++ .get_name = vaapi_getname,
++ .create = vaapi_create,
++ .destroy = vaapi_destroy,
++ .encode = vaapi_encode,
++ .get_defaults2 = vaapi_defaults,
++ .get_properties2 = vaapi_properties,
++ .get_video_info = vaapi_video_info,
++ .type_data = &hevc_type,
+ };
+
+ #endif
diff --git a/obs-studio-21.0.3-linkage.patch b/obs-studio-21.0.3-linkage.patch
deleted file mode 100644
index 2bf384e..0000000
--- a/obs-studio-21.0.3-linkage.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-Index: libobs/CMakeLists.txt
-===================================================================
---- libobs/CMakeLists.txt
-+++ libobs/CMakeLists.txt 2018-03-09 23:07:01.583210027 +0100
-@@ -463,6 +467,11 @@
- ${OBS_JANSSON_IMPORT}
- ${FFMPEG_LIBRARIES}
- ${ZLIB_LIBRARIES}
-+ ${XCB_LIBRARIES}
-+ ${X11_XCB_LIBRARIES}
-+ ${X11_LIBRARIES}
-+ -lm -ldl
-+
- PUBLIC
- ${THREADS_LIBRARIES})
-
diff --git a/obs-studio-22.0.2-linkage.patch b/obs-studio-22.0.2-linkage.patch
deleted file mode 100644
index ba3879d..0000000
--- a/obs-studio-22.0.2-linkage.patch
+++ /dev/null
@@ -1,25 +0,0 @@
-diff -Naur obs-studio-22.0.2.orig/libobs/CMakeLists.txt obs-studio-22.0.2/libobs/CMakeLists.txt
---- obs-studio-22.0.2.orig/libobs/CMakeLists.txt 2018-09-18 16:30:17.994712405 +0300
-+++ obs-studio-22.0.2/libobs/CMakeLists.txt 2018-09-18 16:30:18.005712389 +0300
-@@ -11,6 +11,10 @@
- list(REMOVE_ITEM FFMPEG_LIBRARIES ${FFMPEG_AVCODEC_LIBRARIES})
- endif()
-
-+find_package(XCB COMPONENTS XCB REQUIRED RANDR REQUIRED XINERAMA REQUIRED)
-+
-+find_package(X11 REQUIRED)
-+
- if(UNIX)
- if (NOT APPLE)
- find_package(X11_XCB REQUIRED)
-@@ -479,6 +483,10 @@
- ${OBS_JANSSON_IMPORT}
- ${FFMPEG_LIBRARIES}
- ${ZLIB_LIBRARIES}
-+ ${XCB_LIBRARIES}
-+ ${X11_XCB_LIBRARIES}
-+ ${X11_LIBRARIES}
-+ -lm -ldl
- PUBLIC
- ${THREADS_LIBRARIES})
-
diff --git a/obs-studio-25.0.3-fix-compiler-warnings.patch b/obs-studio-25.0.3-fix-compiler-warnings.patch
deleted file mode 100644
index 6f2a42a..0000000
--- a/obs-studio-25.0.3-fix-compiler-warnings.patch
+++ /dev/null
@@ -1,23 +0,0 @@
-diff -up obs-studio-25.0.3/plugins/linux-v4l2/v4l2-controls.c.omv~ obs-studio-25.0.3/plugins/linux-v4l2/v4l2-controls.c
---- obs-studio-25.0.3/plugins/linux-v4l2/v4l2-controls.c.omv~ 2020-03-24 19:20:06.747017305 +0100
-+++ obs-studio-25.0.3/plugins/linux-v4l2/v4l2-controls.c 2020-03-24 19:20:44.317640105 +0100
-@@ -102,7 +102,7 @@ static inline bool add_control_property(
- obs_property_t *prop = NULL;
-
- if (!valid_control(qctrl)) {
-- return;
-+ return false;
- }
-
- switch (qctrl->type) {
-@@ -131,7 +131,10 @@ static inline bool add_control_property(
- blog(LOG_INFO, "setting default for %s to %d",
- (char *)qctrl->name, qctrl->default_value);
- break;
-+ default:
-+ return false;
- }
-+ return true;
- }
-
- int_fast32_t v4l2_update_controls(int_fast32_t dev, obs_properties_t *props,
diff --git a/obs-studio-26.0.0-rc1-linkage.patch b/obs-studio-26.0.0-rc1-linkage.patch
new file mode 100644
index 0000000..31534a9
--- /dev/null
+++ b/obs-studio-26.0.0-rc1-linkage.patch
@@ -0,0 +1,24 @@
+diff -uraN obs-studio-26.1.0/libobs/CMakeLists.txt omv-obs-studio-26.1.0/libobs/CMakeLists.txt
+--- obs-studio-26.1.0/libobs/CMakeLists.txt 2020-12-14 20:53:01.000000000 +0100
++++ omv-obs-studio-26.1.0/libobs/CMakeLists.txt 2020-12-14 21:41:12.281592283 +0100
+@@ -10,6 +10,9 @@
+ if (NOT "${FFMPEG_AVCODEC_LIBRARIES}" STREQUAL "")
+ list(REMOVE_ITEM FFMPEG_LIBRARIES ${FFMPEG_AVCODEC_LIBRARIES})
+ endif()
++find_package(XCB COMPONENTS XCB REQUIRED RANDR REQUIRED XINERAMA REQUIRED)
++
++find_package(X11 REQUIRED)
+
+ if(DEBUG_FFMPEG_MUX)
+ add_definitions(-DSHOW_SUBPROCESSES)
+@@ -518,6 +521,10 @@
+ ${OBS_JANSSON_IMPORT}
+ ${FFMPEG_LIBRARIES}
+ ${ZLIB_LIBRARIES}
++ ${XCB_LIBRARIES}
++ ${X11_XCB_LIBRARIES}
++ ${X11_LIBRARIES}
++ -lm -ldl
+ PUBLIC
+ ${THREADS_LIBRARIES})
+
diff --git a/obs-studio.spec b/obs-studio.spec
index d61bdbd..31487f4 100644
--- a/obs-studio.spec
+++ b/obs-studio.spec
@@ -12,14 +12,14 @@
Summary: Free and open source software for video recording and live streaming
Name: obs-studio
-Version: 25.0.7
+Version: 26.1.1
Release: 1
License: GPLv2+
Group: Video
Url: https://obsproject.com
Source0: https://github.com/obsproject/%{name}/archive/%{version}/%{name}-%{version}.tar.gz
-Patch0: %{name}-22.0.2-linkage.patch
-Patch1: obs-studio-25.0.3-fix-compiler-warnings.patch
+Patch0: %{name}-26.0.0-rc1-linkage.patch
+Patch1: hevc-vaapi.diff
BuildRequires: cmake ninja
BuildRequires: qmake5
BuildRequires: freetype-devel
@@ -59,7 +59,7 @@ BuildRequires: pkgconfig(xcb-xfixes)
BuildRequires: pkgconfig(xcb-xinerama)
BuildRequires: pkgconfig(xcomposite)
BuildRequires: pkgconfig(xfixes)
-BuildRequires: pkgconfig(python3)
+BuildRequires: pkgconfig(python)
BuildRequires: pkgconfig(lua)
BuildRequires: swig
BuildRequires: mbedtls-devel
@@ -192,6 +192,5 @@ Frontend-api library for %{name}.
%build
%ninja_build -C build
-
%install
%ninja_install -C build