summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Beddek <telans@posteo.de>2022-01-16 17:14:22 +1300
committerSam James <sam@gentoo.org>2022-01-19 01:15:29 +0000
commit49e4794474d6d730937ae3649dcca86598f3407e (patch)
tree496e32ab7c650be3ed3b45bfb9c1c43fbfc7b141
parentmedia-video/handbrake: add ffmpeg 5.0 patch (diff)
downloadgentoo-49e4794474d6d730937ae3649dcca86598f3407e.tar.gz
gentoo-49e4794474d6d730937ae3649dcca86598f3407e.tar.bz2
gentoo-49e4794474d6d730937ae3649dcca86598f3407e.zip
media-video/obs-studio: add ffmpeg 5.0 patch
Signed-off-by: James Beddek <telans@posteo.de> Closes: https://github.com/gentoo/gentoo/pull/23821 Signed-off-by: Sam James <sam@gentoo.org>
-rw-r--r--media-video/obs-studio/files/obs-studio-27.1.3-ffmpeg-5.0.patch314
-rw-r--r--media-video/obs-studio/obs-studio-27.1.3-r1.ebuild3
2 files changed, 316 insertions, 1 deletions
diff --git a/media-video/obs-studio/files/obs-studio-27.1.3-ffmpeg-5.0.patch b/media-video/obs-studio/files/obs-studio-27.1.3-ffmpeg-5.0.patch
new file mode 100644
index 000000000000..a529dca715a9
--- /dev/null
+++ b/media-video/obs-studio/files/obs-studio-27.1.3-ffmpeg-5.0.patch
@@ -0,0 +1,314 @@
+# https://git.exherbo.org/media.git/commit/?id=10c891cb37f4f7e42e95a00b27a5d4636266353e
+# https://git.exherbo.org/media.git/commit/?id=e888c31724357431dbd0e73014ca87a552850d45
+
+From 08547a1696fa381d0bda18aed57b9f87a6b1b334 Mon Sep 17 00:00:00 2001
+From: Ryan Foster <RytoEX@gmail.com>
+Date: Sat, 6 Nov 2021 18:57:35 -0400
+Subject: [PATCH] obs-ffmpeg: Include avcodec header for AVCodecContext
+
+FFmpeg commit e67e02d15672 [1] drops avcodec.h from avformat.h includes.
+Therefore we need to include it explicitly.
+
+[1]: https://github.com/FFmpeg/FFmpeg/commit/e67e02d15672a87da1b0566e197a1e19dc7e1e33
+ lavf/avformat.h: drop the avcodec.h include
+---
+ plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c | 1 +
+ plugins/obs-ffmpeg/obs-ffmpeg-formats.h | 2 ++
+ plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c | 1 +
+ plugins/obs-ffmpeg/obs-ffmpeg-output.h | 1 +
+ 4 files changed, 5 insertions(+)
+
+diff --git a/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c b/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
+index 1c160ced4b1f..e4c6cdb9fa2f 100644
+--- a/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
++++ b/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
+@@ -27,6 +27,7 @@
+ #include "ffmpeg-mux.h"
+
+ #include <util/dstr.h>
++#include <libavcodec/avcodec.h>
+ #include <libavformat/avformat.h>
+
+ #define ANSI_COLOR_RED "\x1b[0;91m"
+diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-formats.h b/plugins/obs-ffmpeg/obs-ffmpeg-formats.h
+index 62e3866d037a..b40ef37293b4 100644
+--- a/plugins/obs-ffmpeg/obs-ffmpeg-formats.h
++++ b/plugins/obs-ffmpeg/obs-ffmpeg-formats.h
+@@ -1,5 +1,7 @@
+ #pragma once
+
++#include <libavcodec/avcodec.h>
++
+ static inline int64_t rescale_ts(int64_t val, AVCodecContext *context,
+ AVRational new_base)
+ {
+diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c b/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c
+index f2d93d2def89..e66010ce5f9c 100644
+--- a/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c
++++ b/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c
+@@ -24,6 +24,7 @@
+
+ #include <libavutil/opt.h>
+ #include <libavutil/pixdesc.h>
++#include <libavcodec/avcodec.h>
+ #include <libavformat/avformat.h>
+
+ #include "obs-ffmpeg-formats.h"
+diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-output.h b/plugins/obs-ffmpeg/obs-ffmpeg-output.h
+index 99f4dcd13b44..72d89dfacc4c 100644
+--- a/plugins/obs-ffmpeg/obs-ffmpeg-output.h
++++ b/plugins/obs-ffmpeg/obs-ffmpeg-output.h
+@@ -2,6 +2,7 @@
+
+ #include <libavutil/opt.h>
+ #include <libavutil/pixdesc.h>
++#include <libavcodec/avcodec.h>
+ #include <libavformat/avformat.h>
+ #include <libswscale/swscale.h>
+
+From abf1d609d29196921df8f09ab6e07340b7cf9660 Mon Sep 17 00:00:00 2001
+From: Ryan Foster <RytoEX@gmail.com>
+Date: Sat, 6 Nov 2021 18:58:05 -0400
+Subject: [PATCH] obs-ffmpeg: Include channel_layout.h
+
+avcodec.h stopped including channel_layout.h per FFmpeg commit
+1be3d8a0cb77 [1]. avformat.h stopped including avcodec.h per FFmpeg
+commit e67e02d15672 [2]. As a result, we need to explicitly include
+avutil/channel_layout.h when needed. Fixes compilation error against
+FFmpeg later than the two mentioned commits.
+
+[1]: https://github.com/FFmpeg/FFmpeg/commit/1be3d8a0cb77f8d34c1f39b47bf5328fe10c82d7
+[2]: https://github.com/FFmpeg/FFmpeg/commit/e67e02d15672a87da1b0566e197a1e19dc7e1e33
+---
+ plugins/obs-ffmpeg/obs-ffmpeg-audio-encoders.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-audio-encoders.c b/plugins/obs-ffmpeg/obs-ffmpeg-audio-encoders.c
+index 2e3899464362..cbcb9ac31bcb 100644
+--- a/plugins/obs-ffmpeg/obs-ffmpeg-audio-encoders.c
++++ b/plugins/obs-ffmpeg/obs-ffmpeg-audio-encoders.c
+@@ -21,6 +21,7 @@
+ #include <util/dstr.h>
+ #include <obs-module.h>
+
++#include <libavutil/channel_layout.h>
+ #include <libavutil/opt.h>
+ #include <libavformat/avformat.h>
+
+From ce734366bc0b95ff91930f463e7ebe528cf8eabf Mon Sep 17 00:00:00 2001
+From: Ryan Foster <RytoEX@gmail.com>
+Date: Sat, 6 Nov 2021 18:58:36 -0400
+Subject: [PATCH] obs-ffmpeg: Respect AVFormatContext and AVOutputFormat
+ constness
+
+AVFormatContext::oformat was made const on April 27, 2021 [1]. If we
+respect the constness of AVOutputFormat and do not cast results from
+FFmpeg functions to non-const, we cannot modify the results after the
+fact. Our choices are either to cast them to non-const (and presumably
+have them implicitly casted back to const on later function calls), or
+only try to modify the results in versions of FFmpeg where these are not
+expected to be const.
+
+Instead of relying on casts, we can set the encoder values in the
+ffmpeg_cfg struct, which are later passed to new_stream.
+
+Also modifies deps/media-playback. Removes compiler warnings.
+Some avformat functions return const AV(In/Out)putFormat per [1], so
+ifdef as needed.
+
+[1]: https://github.com/FFmpeg/FFmpeg/commit/56450a0ee4fdda160f4039fc2ae33edfd27765c9
+ lavf 59.0.100 avformat.h
+ avformat: Constify the API wrt AV(In|Out)putFormat
+
+ Also constify AVProbeData.
+---
+ deps/media-playback/media-playback/media.c | 4 ++++
+ plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c | 10 ++++++++++
+ plugins/obs-ffmpeg/obs-ffmpeg-output.c | 19 ++++++++++++++++++-
+ 3 files changed, 32 insertions(+), 1 deletion(-)
+
+diff --git a/deps/media-playback/media-playback/media.c b/deps/media-playback/media-playback/media.c
+index 9041b62e9cdd..a09b58ed5d10 100644
+--- a/deps/media-playback/media-playback/media.c
++++ b/deps/media-playback/media-playback/media.c
+@@ -608,7 +608,11 @@ static int interrupt_callback(void *data)
+
+ static bool init_avformat(mp_media_t *m)
+ {
++#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(59, 0, 100)
+ AVInputFormat *format = NULL;
++#else
++ const AVInputFormat *format = NULL;
++#endif
+
+ if (m->format_name && *m->format_name) {
+ format = av_find_input_format(m->format_name);
+diff --git a/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c b/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
+index e4c6cdb9fa2f..ffce3ee33eec 100644
+--- a/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
++++ b/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
+@@ -565,7 +565,11 @@ static inline bool ffmpeg_mux_get_extra_data(struct ffmpeg_mux *ffm)
+
+ static inline int open_output_file(struct ffmpeg_mux *ffm)
+ {
++#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(59, 0, 100)
+ AVOutputFormat *format = ffm->output->oformat;
++#else
++ const AVOutputFormat *format = ffm->output->oformat;
++#endif
+ int ret;
+
+ if ((format->flags & AVFMT_NOFILE) == 0) {
+@@ -631,7 +635,11 @@ static bool ffmpeg_mux_is_network(struct ffmpeg_mux *ffm)
+
+ static int ffmpeg_mux_init_context(struct ffmpeg_mux *ffm)
+ {
++#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(59, 0, 100)
+ AVOutputFormat *output_format;
++#else
++ const AVOutputFormat *output_format;
++#endif
+ int ret;
+ bool is_http = false;
+ is_http = (strncmp(ffm->params.file, HTTP_PROTO,
+@@ -665,8 +673,10 @@ static int ffmpeg_mux_init_context(struct ffmpeg_mux *ffm)
+ return FFM_ERROR;
+ }
+
++#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(59, 0, 100)
+ ffm->output->oformat->video_codec = AV_CODEC_ID_NONE;
+ ffm->output->oformat->audio_codec = AV_CODEC_ID_NONE;
++#endif
+
+ if (!init_streams(ffm)) {
+ free_avformat(ffm);
+diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-output.c b/plugins/obs-ffmpeg/obs-ffmpeg-output.c
+index 6bc1637b1796..7447e952b9c2 100644
+--- a/plugins/obs-ffmpeg/obs-ffmpeg-output.c
++++ b/plugins/obs-ffmpeg/obs-ffmpeg-output.c
+@@ -543,6 +543,7 @@ static enum AVCodecID get_codec_id(const char *name, int id)
+ return codec->id;
+ }
+
++#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(59, 0, 100)
+ static void set_encoder_ids(struct ffmpeg_data *data)
+ {
+ data->output->oformat->video_codec = get_codec_id(
+@@ -551,6 +552,7 @@ static void set_encoder_ids(struct ffmpeg_data *data)
+ data->output->oformat->audio_codec = get_codec_id(
+ data->config.audio_encoder, data->config.audio_encoder_id);
+ }
++#endif
+
+ bool ffmpeg_data_init(struct ffmpeg_data *data, struct ffmpeg_cfg *config)
+ {
+@@ -570,7 +572,13 @@ bool ffmpeg_data_init(struct ffmpeg_data *data, struct ffmpeg_cfg *config)
+
+ is_rtmp = (astrcmpi_n(config->url, "rtmp://", 7) == 0);
+
+- AVOutputFormat *output_format = av_guess_format(
++#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(59, 0, 100)
++ AVOutputFormat *output_format;
++#else
++ const AVOutputFormat *output_format;
++#endif
++
++ output_format = av_guess_format(
+ is_rtmp ? "flv" : data->config.format_name, data->config.url,
+ is_rtmp ? NULL : data->config.format_mime_type);
+
+@@ -596,6 +604,7 @@ bool ffmpeg_data_init(struct ffmpeg_data *data, struct ffmpeg_cfg *config)
+ goto fail;
+ }
+
++#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(59, 0, 100)
+ if (is_rtmp) {
+ data->output->oformat->video_codec = AV_CODEC_ID_H264;
+ data->output->oformat->audio_codec = AV_CODEC_ID_AAC;
+@@ -603,6 +612,14 @@ bool ffmpeg_data_init(struct ffmpeg_data *data, struct ffmpeg_cfg *config)
+ if (data->config.format_name)
+ set_encoder_ids(data);
+ }
++#else
++ if (is_rtmp) {
++ data->config.audio_encoder = "aac";
++ data->config.audio_encoder_id = AV_CODEC_ID_AAC;
++ data->config.video_encoder = "libx264";
++ data->config.video_encoder_id = AV_CODEC_ID_H264;
++ }
++#endif
+
+ if (!init_streams(data))
+ goto fail;
+
+From d78971b4db34d5fffbd11d2acabf37a65e11cd58 Mon Sep 17 00:00:00 2001
+From: pkv <pkv@obsproject.com>
+Date: Fri, 17 Dec 2021 20:52:11 +0100
+Subject: [PATCH] obs-ffmpeg: Further FFmpeg deprecations fixes for FFmpeg 4.4+
+
+avcodec.h stopped including channel_layout.h per FFmpeg commit
+1be3d8a0cb77 [1]. Fixes compilation error on macOS against
+FFmpeg later than the mentioned commit.
+[1] https://github.com/FFmpeg/FFmpeg/commit/1be3d8a0cb77f8d34c1f39b47bf5328fe10c82d7
+---
+ plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c | 1 +
+ plugins/obs-ffmpeg/obs-ffmpeg-output.c | 1 +
+ 2 files changed, 2 insertions(+)
+
+diff --git a/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c b/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
+index c07e22abe266..db26cb425ce5 100644
+--- a/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
++++ b/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
+@@ -29,6 +29,7 @@
+ #include <util/dstr.h>
+ #include <libavcodec/avcodec.h>
+ #include <libavformat/avformat.h>
++#include <libavutil/channel_layout.h>
+
+ #define ANSI_COLOR_RED "\x1b[0;91m"
+ #define ANSI_COLOR_MAGENTA "\x1b[0;95m"
+diff --git a/plugins/obs-ffmpeg/obs-ffmpeg-output.c b/plugins/obs-ffmpeg/obs-ffmpeg-output.c
+index d3637ebbb59b..7d1f12a60393 100644
+--- a/plugins/obs-ffmpeg/obs-ffmpeg-output.c
++++ b/plugins/obs-ffmpeg/obs-ffmpeg-output.c
+@@ -25,6 +25,7 @@
+ #include "obs-ffmpeg-output.h"
+ #include "obs-ffmpeg-formats.h"
+ #include "obs-ffmpeg-compat.h"
++#include <libavutil/channel_layout.h>
+
+ struct ffmpeg_output {
+ obs_output_t *output;
+
+From c398ac9739a82bc95632eef9544dd0fb5bc5f0cf Mon Sep 17 00:00:00 2001
+From: pkv <pkv@obsproject.com>
+Date: Sat, 6 Nov 2021 18:59:37 -0400
+Subject: [PATCH] obs-ffmpeg: Fix NVENC old codec naming removed in FFmpeg
+
+Per FFmpeg commit 337f777f378c [1], FFmpeg removed nvenc_h264_encoder
+and nvenc_hevc_encoder after deprecation in FFmpeg commit 888a5c794778
+[2]. The names to be used are ff_h264_nvenc_encoder and
+ff_hevc_nvenc_encoder. So we must allow alternative search of codec as
+h264_nvenc or nvenc_h264 in obs-ffmpeg.c.
+
+[1]: https://github.com/FFmpeg/FFmpeg/commit/337f777f378cfcc0d6f0d01fb7125905e8b0da55
+[2]: https://github.com/FFmpeg/FFmpeg/commit/888a5c794778a2f2aad22e9b4a3952dff92b11fa
+---
+ plugins/obs-ffmpeg/obs-ffmpeg.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/plugins/obs-ffmpeg/obs-ffmpeg.c b/plugins/obs-ffmpeg/obs-ffmpeg.c
+index 7330b2273544..399c5bfa64b6 100644
+--- a/plugins/obs-ffmpeg/obs-ffmpeg.c
++++ b/plugins/obs-ffmpeg/obs-ffmpeg.c
+@@ -180,7 +180,9 @@ static bool nvenc_supported(void)
+ bool success = false;
+
+ if (!nvenc) {
+- goto cleanup;
++ nvenc = avcodec_find_encoder_by_name("h264_nvenc");
++ if (!nvenc)
++ goto cleanup;
+ }
+
+ #if defined(_WIN32)
diff --git a/media-video/obs-studio/obs-studio-27.1.3-r1.ebuild b/media-video/obs-studio/obs-studio-27.1.3-r1.ebuild
index 9cd43053e715..34b197508564 100644
--- a/media-video/obs-studio/obs-studio-27.1.3-r1.ebuild
+++ b/media-video/obs-studio/obs-studio-27.1.3-r1.ebuild
@@ -1,4 +1,4 @@
-# Copyright 1999-2021 Gentoo Authors
+# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
@@ -121,6 +121,7 @@ QA_PREBUILT="
PATCHES=(
"${FILESDIR}/${PN}-26.1.2-python-3.8.patch"
+ "${FILESDIR}/${PN}-27.1.3-ffmpeg-5.0.patch"
)
pkg_setup() {