summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorzan2020-06-26 13:45:21 -0400
committerzan2020-06-26 13:45:21 -0400
commit330bd023d077eec3fd2d78d62ac1a93863c6076c (patch)
tree064c71606f950c327fd8fe5b3f89399af71a1cd4
downloadaur-330bd023d077eec3fd2d78d62ac1a93863c6076c.tar.gz
initial
-rw-r--r--.SRCINFO46
-rw-r--r--PKGBUILD57
-rw-r--r--hevc-vaapi.diff325
3 files changed, 428 insertions, 0 deletions
diff --git a/.SRCINFO b/.SRCINFO
new file mode 100644
index 000000000000..b87ef98a3c26
--- /dev/null
+++ b/.SRCINFO
@@ -0,0 +1,46 @@
+pkgbase = obs-hevc-vaapi-git
+ pkgdesc = Free and open source software for video recording and live streaming. With VAAPI HEVC support.
+ pkgver = 25.0.7.r198.gaa313a1fb
+ pkgrel = 1
+ url = https://github.com/obsproject/obs-studio
+ arch = i686
+ arch = x86_64
+ license = GPL2
+ makedepends = cmake
+ makedepends = git
+ makedepends = libfdk-aac
+ makedepends = libxcomposite
+ makedepends = x264
+ makedepends = jack
+ makedepends = vlc
+ makedepends = swig
+ makedepends = luajit
+ makedepends = python
+ makedepends = cef-minimal
+ depends = ffmpeg
+ depends = jansson
+ depends = libxinerama
+ depends = libxkbcommon-x11
+ depends = qt5-x11extras
+ depends = curl
+ depends = gtk-update-icon-cache
+ optdepends = libfdk-aac: FDK AAC codec support
+ optdepends = libxcomposite: XComposite capture support
+ optdepends = jack: JACK Support
+ optdepends = vlc: VLC Media Source
+ optdepends = swig: Scripting
+ optdepends = luajit: Lua scripting
+ optdepends = python: Python scripting
+ provides = obs-studio=25.0.7.r198.gaa313a1fb
+ conflicts = obs-studio
+ source = obs-hevc-vaapi-git::git+https://github.com/obsproject/obs-studio.git
+ source = git+https://github.com/Mixer/ftl-sdk.git
+ source = git+https://github.com/obsproject/obs-browser.git
+ source = hevc-vaapi.diff
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = SKIP
+ sha256sums = b277507b6589923382a039e01da7f28a0a8bce80e7ba282b5fd6d179b5431c7c
+
+pkgname = obs-hevc-vaapi-git
+
diff --git a/PKGBUILD b/PKGBUILD
new file mode 100644
index 000000000000..8619b7a7313b
--- /dev/null
+++ b/PKGBUILD
@@ -0,0 +1,57 @@
+# Maintainer zanny <zan@420blaze.it>
+# Contributor Benjamin Klettbach <b dot klettbach at gmail dot com >
+# Contributor: Jonathan Steel <jsteel at archlinux.org>
+# Contributor: ArcticVanguard <LideEmily at gmail dot com>
+# Contributor: ledti <antergist at gmail dot com>
+pkgname=obs-hevc-vaapi-git
+pkgver=25.0.7.r293.gbb890a674
+pkgrel=1
+pkgdesc="Free and open source software for video recording and live streaming. With VAAPI HEVC support."
+arch=("i686" "x86_64")
+url="https://github.com/obsproject/obs-studio"
+license=("GPL2")
+depends=("ffmpeg" "jansson" "libxinerama" "libxkbcommon-x11"
+ "qt5-x11extras" "curl" "gtk-update-icon-cache")
+makedepends=("cmake" "git" "libfdk-aac" "libxcomposite" "x264" "jack"
+ "vlc" "swig" "luajit" "python" "cef-minimal")
+optdepends=("libfdk-aac: FDK AAC codec support"
+ "libxcomposite: XComposite capture support"
+ "jack: JACK Support"
+ "vlc: VLC Media Source"
+ "swig: Scripting"
+ "luajit: Lua scripting"
+ "python: Python scripting")
+provides=("obs-studio=$pkgver")
+conflicts=("obs-studio")
+source=("$pkgname::git+https://github.com/obsproject/obs-studio.git"
+ "git+https://github.com/Mixer/ftl-sdk.git"
+ "git+https://github.com/obsproject/obs-browser.git"
+ "hevc-vaapi.diff")
+sha256sums=("SKIP" "SKIP" "SKIP"
+ "b277507b6589923382a039e01da7f28a0a8bce80e7ba282b5fd6d179b5431c7c")
+
+pkgver() {
+ cd $pkgname
+ git describe --long --tags | sed -r "s/([^-]*-g)/r\1/;s/-/./g"
+}
+
+prepare() {
+ cd $pkgname
+ git config submodule.plugins/obs-outputs/ftl-sdk.url $srcdir/ftl-sdk
+ git config submodule.plugins/obs-browser.url $srcdir/obs-browser
+ git submodule update
+ patch -p1 -i $srcdir/hevc-vaapi.diff
+}
+
+build() {
+ cmake -DCMAKE_INSTALL_PREFIX=/usr \
+ -DBUILD_BROWSER=ON \
+ -B build -S $pkgname
+ cmake --build build
+}
+
+package() {
+ DESTDIR="$pkgdir" cmake --install build
+}
+
+# vim: ts=2:sw=2:expandtab
diff --git a/hevc-vaapi.diff b/hevc-vaapi.diff
new file mode 100644
index 000000000000..32dc2317e247
--- /dev/null
+++ b/hevc-vaapi.diff
@@ -0,0 +1,325 @@
+diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c b/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c
+index 9f2660a4..b8f5c289 100644
+--- a/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c
++++ b/plugins/obs-ffmpeg/obs-ffmpeg-vaapi.c
+@@ -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)
+@@ -262,6 +287,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"
+@@ -272,9 +298,9 @@ static bool vaapi_update(void *data, obs_data_t *settings)
+ "\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);
+ }
+@@ -328,9 +354,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");
++ 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, "---------------------------------");
+
+@@ -466,7 +495,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;
+- 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;
+@@ -487,19 +519,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)
+ {
++ 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);
+ }
+@@ -522,9 +555,13 @@ static bool rate_control_modified(obs_properties_t *ppts, obs_property_t *p,
+ 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;
+@@ -544,41 +581,52 @@ static obs_properties_t *vaapi_properties(void *unused)
+ }
+ }
+
+- 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, "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);
++ }
+
+ 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);
+
+@@ -597,6 +645,7 @@ static obs_properties_t *vaapi_properties(void *unused)
+ obs_module_text("KeyframeIntervalSec"), 0, 20,
+ 1);
+
++ dstr_free(&name);
+ return props;
+ }
+
+@@ -626,11 +675,26 @@ struct obs_encoder_info vaapi_encoder_info = {
+ .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/plugins/obs-ffmpeg/obs-ffmpeg.c b/plugins/obs-ffmpeg/obs-ffmpeg.c
+index 38a7c857..03b270e9 100644
+--- a/plugins/obs-ffmpeg/obs-ffmpeg.c
++++ b/plugins/obs-ffmpeg/obs-ffmpeg.c
+@@ -34,6 +34,7 @@ extern struct obs_encoder_info nvenc_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__
+@@ -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
+