diff options
author | Ionen Wolkens <ionen@gentoo.org> | 2022-03-15 23:17:38 -0400 |
---|---|---|
committer | Ionen Wolkens <ionen@gentoo.org> | 2022-03-15 23:41:47 -0400 |
commit | 393ed20e6cb0037c61b4ca85edaa5d58cece6719 (patch) | |
tree | 11b5c74f371dcafaa078fd9cf89e831461bc09db /media-sound/xmms2 | |
parent | dev-go/go-tools: add 0.1.10 (diff) | |
download | gentoo-393ed20e6cb0037c61b4ca85edaa5d58cece6719.tar.gz gentoo-393ed20e6cb0037c61b4ca85edaa5d58cece6719.tar.bz2 gentoo-393ed20e6cb0037c61b4ca85edaa5d58cece6719.zip |
media-sound/xmms2: fix build with ffmpeg5
Closes: https://bugs.gentoo.org/834398
Signed-off-by: Ionen Wolkens <ionen@gentoo.org>
Diffstat (limited to 'media-sound/xmms2')
-rw-r--r-- | media-sound/xmms2/files/xmms2-0.8_p20201016-ffmpeg5.patch | 125 | ||||
-rw-r--r-- | media-sound/xmms2/xmms2-0.8_p20201016-r2.ebuild | 237 |
2 files changed, 362 insertions, 0 deletions
diff --git a/media-sound/xmms2/files/xmms2-0.8_p20201016-ffmpeg5.patch b/media-sound/xmms2/files/xmms2-0.8_p20201016-ffmpeg5.patch new file mode 100644 index 000000000000..14f999643241 --- /dev/null +++ b/media-sound/xmms2/files/xmms2-0.8_p20201016-ffmpeg5.patch @@ -0,0 +1,125 @@ +Lazy migration from audio4 that's missing in ffmpeg5, may not be +entirely right but tested to play at least .tta/.wma properly. + +Bug: https://bugs.gentoo.org/834398 +Signed-off-by: Ionen Wolkens <ionen@gentoo.org> +--- a/src/plugins/avcodec/avcodec.c ++++ b/src/plugins/avcodec/avcodec.c +@@ -32,4 +32,5 @@ + typedef struct { + AVCodecContext *codecctx; ++ AVPacket packet; + + guchar *buffer; +@@ -150,4 +151,5 @@ + data->buffer_size = AVCODEC_BUFFER_SIZE; + data->codecctx = NULL; ++ data->packet.size = 0; + + data->read_out_frame = av_frame_alloc (); +@@ -155,6 +157,4 @@ + xmms_xform_private_data_set (xform, data); + +- avcodec_register_all (); +- + mimetype = xmms_xform_indata_get_str (xform, + XMMS_STREAM_TYPE_MIMETYPE); +@@ -467,43 +467,35 @@ + xmms_avcodec_internal_decode_some (xmms_avcodec_data_t *data) + { +- int got_frame = 0; +- gint bytes_read = 0; +- AVPacket packet; ++ int rc = 0; + +- av_init_packet (&packet); +- packet.data = data->buffer; +- packet.size = data->buffer_length; +- +- /* clear buffers and reset fields to defaults */ +- av_frame_unref (data->read_out_frame); +- +- bytes_read = avcodec_decode_audio4 ( +- data->codecctx, data->read_out_frame, &got_frame, &packet); +- +- /* The DTS decoder of ffmpeg is buggy and always returns +- * the input buffer length, get frame length from header */ +- /* FIXME: Is ^^^^ still true? */ +- if (!strcmp (data->codec_id, "dca") && bytes_read > 0) { +- bytes_read = ((int)data->buffer[5] << 12) | +- ((int)data->buffer[6] << 4) | +- ((int)data->buffer[7] >> 4); +- bytes_read = (bytes_read & 0x3fff) + 1; ++ if (data->packet.size == 0) { ++ av_init_packet (&data->packet); ++ data->packet.data = data->buffer; ++ data->packet.size = data->buffer_length; ++ ++ rc = avcodec_send_packet(data->codecctx, &data->packet); ++ if (rc == AVERROR_EOF) ++ rc = 0; ++ } ++ ++ if (rc == 0) { ++ rc = avcodec_receive_frame(data->codecctx, data->read_out_frame); ++ if (rc < 0) { ++ data->packet.size = 0; ++ data->buffer_length = 0; ++ if (rc == AVERROR(EAGAIN)) rc = 0; ++ else if (rc == AVERROR_EOF) rc = 1; ++ } ++ else ++ rc = 1; + } + +- if (bytes_read < 0 || bytes_read > data->buffer_length) { ++ if (rc < 0) { ++ data->packet.size = 0; + XMMS_DBG ("Error decoding data!"); + return -1; + } + +- if (bytes_read < data->buffer_length) { +- data->buffer_length -= bytes_read; +- g_memmove (data->buffer, +- data->buffer + bytes_read, +- data->buffer_length); +- } else { +- data->buffer_length = 0; +- } +- +- return got_frame ? 1 : 0; ++ return rc; + } + +--- a/src/plugins/avcodec/wscript ++++ b/src/plugins/avcodec/wscript +@@ -2,5 +2,5 @@ + + ## Code fragments for configuration +-avcodec_decode_audio4_fragment = """ ++avcodec_send_packet_fragment = """ + #ifdef HAVE_LIBAVCODEC_AVCODEC_H + # include "libavcodec/avcodec.h" +@@ -10,9 +10,7 @@ + int main(void) { + AVCodecContext *ctx; +- AVFrame *frame; +- int got_frame; + AVPacket *pkt; + +- avcodec_decode_audio4 (ctx, frame, &got_frame, pkt); ++ avcodec_send_packet (ctx, pkt); + + return 0; +@@ -44,7 +42,7 @@ + # * ffmpeg: commit e4de716, lavc 53.40.0, release 0.9 + # * libav: commit 0eea212, lavc 53.25.0, release 0.8 +- conf.check_cc(fragment=avcodec_decode_audio4_fragment, uselib="avcodec", +- uselib_store="avcodec_decode_audio4", +- msg="Checking for function avcodec_decode_audio4", mandatory=True) ++ conf.check_cc(fragment=avcodec_send_packet_fragment, uselib="avcodec", ++ uselib_store="avcodec_send_packet", ++ msg="Checking for function avcodec_send_packet", mandatory=True) + + # non-mandatory function avcodec_free_frame since diff --git a/media-sound/xmms2/xmms2-0.8_p20201016-r2.ebuild b/media-sound/xmms2/xmms2-0.8_p20201016-r2.ebuild new file mode 100644 index 000000000000..a0b5bd032779 --- /dev/null +++ b/media-sound/xmms2/xmms2-0.8_p20201016-r2.ebuild @@ -0,0 +1,237 @@ +# Copyright 1999-2022 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +EAPI=8 + +PYTHON_COMPAT=( python3_{8..10} ) +inherit multiprocessing optfeature perl-functions python-single-r1 toolchain-funcs + +XMMS2_COMMIT="46da10f0e20c53fd2b40843617ed182c0cba4ebb" +S4_COMMIT="652ac581df7a0bca04334da397f8bb4f86eb7b59" +WAF_VER="2.0.22" + +DESCRIPTION="X(cross)platform Music Multiplexing System, next generation of the XMMS player" +HOMEPAGE="https://github.com/XMMS2" +SRC_URI=" + https://github.com/xmms2/xmms2-devel/archive/${XMMS2_COMMIT}.tar.gz -> ${P}.tar.gz + https://github.com/xmms2/s4/archive/${S4_COMMIT}.tar.gz -> ${PN}-s4-${PV}.tar.gz + https://waf.io/waf-${WAF_VER}.tar.bz2" +S="${WORKDIR}/${PN}-devel-${XMMS2_COMMIT}" + +LICENSE="GPL-2+ LGPL-2.1+" +SLOT="0" +KEYWORDS="~alpha ~amd64 ~arm ~ppc ~riscv ~x86" + +# IUSE static map to be passed to --with-{optionals,plugins}=opt1,opt2,... +# flag:opt = `usev flag opt`, opt = `usev opt`, :opt = `echo opt` +XMMS2_OPTIONALS=( + cxx:xmmsclient++,xmmsclient++-glib :launcher mlib-update:medialib-updater + :nycli perl :pixmaps python server:s4 test:tests + # disabled: et,mdns,migrate-collections,ruby,sqlite2s4,vistest,xmmsclient-cf,xmmsclient-ecore +) +XMMS2_PLUGINS=( + aac:faad airplay alsa ao asf :asx cdda :cue curl :diskwrite :equalizer + ffmpeg:apefile,avcodec,flv,tta :file flac fluidsynth:fluidsynth,mid1,midsquash + gme :html ices :icymetaint :id3v2 jack :karaoke :m3u mac +mad mms modplug + mp3:mpg123 :mp4 musepack :normalize :null :nulstripper ofa opus oss :pls + pulseaudio:pulse :replaygain samba sid sndfile speex tremor vocoder +vorbis + :wave wavpack :xml xml:rss,xspf zeroconf:daap + # disabled: coreaudio,gvfs,nms,sc68,sun,waveout +) + +IUSE=" + ${XMMS2_OPTIONALS[@]%:*} + ${XMMS2_PLUGINS[@]%:*} + +server valgrind" +REQUIRED_USE="${PYTHON_REQUIRED_USE}" +RESTRICT="!test? ( test ) !server? ( test )" + +COMMON_DEPEND=" + dev-libs/glib:2 + sys-libs/readline:= + server? ( + aac? ( media-libs/faad2 ) + airplay? ( dev-libs/openssl:= ) + alsa? ( media-libs/alsa-lib ) + ao? ( media-libs/libao ) + cdda? ( + dev-libs/libcdio-paranoia:= + dev-libs/libcdio:= + media-libs/libdiscid + ) + curl? ( net-misc/curl ) + ffmpeg? ( media-video/ffmpeg:= ) + flac? ( media-libs/flac ) + fluidsynth? ( media-sound/fluidsynth:= ) + gme? ( media-libs/game-music-emu ) + ices? ( + media-libs/libogg + media-libs/libshout + media-libs/libvorbis + ) + jack? ( virtual/jack ) + mac? ( media-sound/mac ) + mad? ( media-libs/libmad ) + mms? ( + media-libs/libmms + media-video/ffmpeg:= + ) + modplug? ( media-libs/libmodplug ) + mp3? ( media-sound/mpg123 ) + musepack? ( media-sound/musepack-tools ) + ofa? ( + dev-libs/expat + media-libs/libofa + sci-libs/fftw:3.0= + ) + opus? ( + media-libs/libogg + media-libs/opus + media-libs/opusfile + ) + pulseaudio? ( media-sound/pulseaudio ) + samba? ( net-fs/samba ) + sid? ( media-libs/libsidplay:2 ) + sndfile? ( media-libs/libsndfile ) + speex? ( + media-libs/libogg + media-libs/speex + ) + tremor? ( media-libs/tremor ) + vocoder? ( + media-libs/libsamplerate + sci-libs/fftw:3.0= + ) + vorbis? ( media-libs/libvorbis ) + wavpack? ( media-sound/wavpack ) + xml? ( dev-libs/libxml2 ) + zeroconf? ( + net-dns/avahi[mdnsresponder-compat] + net-misc/curl + ) + ) + python? ( virtual/libcrypt:= )" +RDEPEND=" + ${COMMON_DEPEND} + perl? ( + dev-lang/perl + dev-perl/glib-perl + virtual/perl-Carp + virtual/perl-IO + virtual/perl-Scalar-List-Utils + ) + python? ( + ${PYTHON_DEPS} + $(python_gen_cond_dep 'dev-python/pygobject[${PYTHON_USEDEP}]') + )" +DEPEND=" + ${COMMON_DEPEND} + cxx? ( dev-libs/boost ) + test? ( dev-util/cunit )" +BDEPEND=" + ${PYTHON_DEPS} + virtual/pkgconfig + perl? ( dev-perl/Pod-Parser ) + python? ( $(python_gen_cond_dep 'dev-python/cython[${PYTHON_USEDEP}]') ) + test? ( valgrind? ( dev-util/valgrind ) )" + +PATCHES=( + "${FILESDIR}"/${PN}-0.8-rtvg.patch + "${FILESDIR}"/${PN}-0.8_p20161122-mac-4.patch + "${FILESDIR}"/${PN}-0.8_p20161122-cpp-client.patch + "${FILESDIR}"/${PN}-0.8_p20161122-faad.patch + "${FILESDIR}"/${P}-ffmpeg5.patch +) + +src_prepare() { + rmdir src/lib/s4 && mv ../s4-${S4_COMMIT} src/lib/s4 || die + mv ../waf-${WAF_VER}/waf{,lib} . || die + + default + + sed -e "s|/path/to/.*sf2|${EPREFIX}/usr/share/sounds/sf2/FluidR3_GM.sf2|" \ + -i src/plugins/fluidsynth/fluidsynth.c || die +} + +src_configure() { + local waf=( + ./waf configure + --prefix="${EPREFIX}"/usr + --libdir="${EPREFIX}"/usr/$(get_libdir) + --boost-includes="${ESYSROOT}"/usr/include # needed for prefix + --with-custom-version="%(version)s (git commit: ${XMMS2_COMMIT:0:8})" + --with-target-platform="${CHOST}" + ) + + xmms2_flag() { + local IFS=: + set -- ${1#+} + + if [[ ${1} ]]; then + usev ${1} ,${2:-${1}} + else + echo ,${2} + fi + } + + local flag optionals plugins + + if use server; then + for flag in "${XMMS2_PLUGINS[@]}"; do + plugins+=$(xmms2_flag ${flag}) + done + else + waf+=( --without-xmms2d ) + fi + + for flag in "${XMMS2_OPTIONALS[@]}"; do + optionals+=$(xmms2_flag ${flag}) + done + + waf+=( + # pass even if empty to avoid automagic + --with-optionals=${optionals:1} + --with-plugins=${plugins:1} + ) + + if use perl; then + perl_set_version + waf+=( --with-perl-archdir="${ARCH_LIB}" ) + fi + + if use valgrind; then + if valgrind true &>/dev/null; then + waf+=( --with-valgrind ) + else + ewarn "valgrind was disabled due to failing a basic sanity check" #807271 + fi + fi + + tc-export AR CC CXX + + echo "${waf[*]}" + "${waf[@]}" || die +} + +src_compile() { + ./waf build -j$(makeopts_jobs) --verbose --notests || die +} + +src_test() { + ./waf --alltests || die +} + +src_install() { + ./waf install --destdir="${D}" --without-ldconfig --notests || die + + einstalldocs + + use python && python_optimize + + # to avoid editing waftools/man.py (use find given not always installed) + find "${ED}" -name '*.gz' -exec gzip -d {} + || die +} + +pkg_postinst() { + use fluidsynth && optfeature "the default MIDI soundfont" media-sound/fluid-soundfont +} |