diff options
author | zan | 2020-06-26 13:45:21 -0400 |
---|---|---|
committer | zan | 2020-06-26 13:45:21 -0400 |
commit | 330bd023d077eec3fd2d78d62ac1a93863c6076c (patch) | |
tree | 064c71606f950c327fd8fe5b3f89399af71a1cd4 | |
download | aur-330bd023d077eec3fd2d78d62ac1a93863c6076c.tar.gz |
initial
-rw-r--r-- | .SRCINFO | 46 | ||||
-rw-r--r-- | PKGBUILD | 57 | ||||
-rw-r--r-- | hevc-vaapi.diff | 325 |
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 + |