diff --git a/multimedia/libxine/Makefile b/multimedia/libxine/Makefile index e3f6a2d82ad7..b8ca9980f6d7 100644 --- a/multimedia/libxine/Makefile +++ b/multimedia/libxine/Makefile @@ -1,194 +1,201 @@ PORTNAME= xine DISTVERSION= 1.2.13 PORTREVISION= 15 CATEGORIES= multimedia MASTER_SITES= SF/${PORTNAME}/${PORTNAME}-lib/${DISTVERSION} PKGNAMEPREFIX= lib DISTNAME= ${PORTNAME}-lib-${DISTVERSION} MAINTAINER= ports@FreeBSD.org COMMENT= Libraries for xine multimedia player WWW= https://xine.sourceforge.net/ LICENSE= GPLv2+ LICENSE_FILE= ${WRKSRC}/COPYING LIB_DEPENDS= libFLAC.so:audio/flac \ liba52.so:audio/liba52 \ libvorbis.so:audio/libvorbis \ libmng.so:graphics/libmng \ libpng.so:graphics/png \ libdvdread.so:multimedia/libdvdread \ libfontconfig.so:x11-fonts/fontconfig \ libfreetype.so:print/freetype2 \ libmodplug.so:audio/libmodplug \ libtheora.so:multimedia/libtheora \ libmad.so:audio/libmad \ libdca.so:multimedia/libdca \ libavcodec.so:multimedia/ffmpeg \ libfaad.so:audio/faad \ libvdpau.so:multimedia/libvdpau \ libvpx.so:multimedia/libvpx \ libogg.so:audio/libogg \ libdvdnav.so:multimedia/libdvdnav -EXTRA_PATCHES= ${FILESDIR}/ffmpeg8-1.patch:-p1 \ - ${FILESDIR}/ffmpeg8-2.patch:-p1 +# patch obtain via hg export -r +EXTRA_PATCHES= \ + ${FILESDIR}/771f4ae27e582123ff3500444718fc8f96186d74.patch:-p1 \ + ${FILESDIR}/0a786d63bbdb2d780a9231f6772e84e743c72014.patch:-p1 \ + ${FILESDIR}/6f1000084f6084f49c95c202d12593e49916f58b.patch:-p1 \ + ${FILESDIR}/1e7b184008860c8be2289c3cefd9dee57f06193a.patch:-p1 \ + ${FILESDIR}/73b833e7fe356cd2d9490dda4ebc9bfe16fce958.patch:-p1 \ + ${FILESDIR}/9bb3977ea7e2b652742b3cdd200b0a4a72eb48bc.patch:-p1 \ + ${FILESDIR}/a8fffd1193b2247c7f732d4df83dcc03fce96dbe.patch:-p1 USES= compiler cpe gl gmake gnome iconv libtool:keepla jpeg \ localbase pathfix perl5 pkgconfig tar:xz xorg LLD_UNSAFE= yes CPE_PRODUCT= xine-lib CPE_VENDOR= xine GNU_CONFIGURE= yes USE_XORG= x11 xcb xv xinerama xext sm ice USE_GL= gl glu USE_PERL5= build USE_LDCONFIG= yes CONFIGURE_ARGS= --with-libflac \ --with-fontconfig \ --with-freetype \ --enable-musepack \ --enable-real-codecs \ --without-esound \ --disable-crypto MAKE_ENV= V=1 MAKE_ARGS= pkgdatadir="${DATADIR}" \ datadir="${DATADIR}" \ libdir="${PREFIX}/lib" CFLAGS_i386= -fomit-frame-pointer DOCSDIR= ${PREFIX}/share/doc/xine-lib # Please sync with XINE_PLUGINSDIR in multimedia/xine # and multimedia/vdr-plugin-xineliboutput PLUGINSDIR= lib/xine/plugins/2.11 PLIST_SUB= PLUGINSDIR="${PLUGINSDIR}" OPTIONS_DEFINE= AALIB ALSA AOM CACA DAV1D DOCS DMX_IMAGE DVB \ IMAGEMAGICK IPV6 JACK LIBBLURAY NFS NLS PIXBUF \ PULSEAUDIO SDL SFTP SMB SNDIO SPEEX V4L VAAPI \ VCD WAVPACK WAYLAND XVMC OPTIONS_DEFAULT= DVB OPENSSL PIXBUF SPEEX VAAPI VCD WAVPACK OPTIONS_DEFINE_i386= W32DLL OPTIONS_DEFAULT_i386= W32DLL OPTIONS_GROUP= TLS OPTIONS_GROUP_TLS= GNUTLS OPENSSL OPTIONS_SUB= yes AOM_DESC= Enable libaom AV1 decoder support DAV1D_DESC= Enable dav1d AV1 decoder support DMX_IMAGE_DESC= DMX image plugin DVB_DESC= DVB plugin NFS_DESC= Enable NFS support using libnfs SDL_DESC= Enable support for SDL 1 video output SFTP_DESC= Enable SFTP support using libssh2 TLS_DESC= Enable TLS support for https and ftps VCD_DESC= Enable VCD (VideoCD) support W32DLL_DESC= Win32 codec support AALIB_LIB_DEPENDS= libaa.so:graphics/aalib AALIB_CONFIGURE_ENABLE= aalib ALSA_LIB_DEPENDS= libasound.so:audio/alsa-lib ALSA_CONFIGURE_WITH= alsa AOM_LIB_DEPENDS= libaom.so:multimedia/aom AOM_CONFIGURE_WITH= libaom CACA_LIB_DEPENDS= libcaca.so:graphics/libcaca CACA_CONFIGURE_WITH= caca DAV1D_LIB_DEPENDS= libdav1d.so:multimedia/dav1d DAV1D_CONFIGURE_WITH= dav1d DVB_BUILD_DEPENDS= v4l_compat>=1.0.20100321:multimedia/v4l_compat DVB_CONFIGURE_ENABLE= dvb GNUTLS_LIB_DEPENDS= libgnutls.so:security/gnutls GNUTLS_CONFIGURE_ON= --enable-tls IMAGEMAGICK_USES= magick IMAGEMAGICK_CONFIGURE_WITH= imagemagick IMAGEMAGICK_IMPLIES= DMX_IMAGE IPV6_CONFIGURE_ENABLE= ipv6 JACK_LIB_DEPENDS= libjack.so:audio/jack JACK_CONFIGURE_WITH= jack LIBBLURAY_LIB_DEPENDS= libbluray.so:multimedia/libbluray LIBBLURAY_CONFIGURE_ENABLE= bluray NLS_USES= gettext NLS_CONFIGURE_ENABLE= nls NFS_LIB_DEPENDS= libnfs.so:net/libnfs NFS_CONFIGURE_ENABLE= nfs OPENSSL_CONFIGURE_ON= --enable-tls OPENSSL_CONFIGURE_ENV= OPENSSL_LIBS="-L${OPENSSLLIB} -lcrypto -lssl" \ OPENSSL_CFLAGS="-I${OPENSSLINC}" OPENSSL_USES= ssl PIXBUF_CONFIGURE_ENABLE= gdkpixbuf PIXBUF_IMPLIES= DMX_IMAGE PIXBUF_USE= GNOME=gdkpixbuf,glib20 PULSEAUDIO_LIB_DEPENDS= libpulse.so:audio/pulseaudio PULSEAUDIO_CONFIGURE_WITH= pulseaudio SDL_CONFIGURE_WITH= sdl SDL_USES= sdl SDL_USE= SDL=sdl SFTP_LIB_DEPENDS= libssh2.so:security/libssh2 SFTP_CONFIGURE_ENABLE= sftp SMB_USES= samba:lib SMB_CONFIGURE_ENV= LIBSMBCLIENT_LIBS="-L${SAMBA_LIBDIR} -lsmbclient" \ LIBSMBCLIENT_CFLAGS="-I${SAMBA_INCLUDEDIR}" SMB_CONFIGURE_ENABLE= samba SNDIO_LIB_DEPENDS= libsndio.so:audio/sndio SNDIO_CONFIGURE_ENABLE= sndio SPEEX_LIB_DEPENDS= libspeex.so:audio/speex SPEEX_CONFIGURE_WITH= speex VAAPI_LIB_DEPENDS= libva.so:multimedia/libva VAAPI_CONFIGURE_ENABLE= vaapi V4L_BUILD_DEPENDS= v4l_compat>=1.0.20100321:multimedia/v4l_compat V4L_LIB_DEPENDS= libv4l2.so:multimedia/libv4l V4L_CONFIGURE_ENABLE= libv4l v4l v4l2 VCD_LIB_DEPENDS= libvcdinfo.so:multimedia/vcdimager \ libcdio.so:sysutils/libcdio VCD_CONFIGURE_ENABLE= vcd W32DLL_CONFIGURE_ENABLE= w32dll W32DLL_PLIST_FILES= ${PLUGINSDIR}/xineplug_decode_w32dll.so WAVPACK_LIB_DEPENDS= libwavpack.so:audio/wavpack WAVPACK_CONFIGURE_WITH= wavpack WAYLAND_LIB_DEPENDS= libwayland-client.so:graphics/wayland WAYLAND_CONFIGURE_ENABLE= wayland .if defined(WITH_NVIDIA304_GL) || exists(${LOCALBASE}/lib/libXvMCNVIDIA.so.1) XVMC_CONFIGURE_WITH= xvmc-lib=XvMCNVIDIA XVMC_LIB_DEPENDS= libXvMCNVIDIA.so:x11/nvidia-driver-304 .else XVMC_CONFIGURE_WITH= xvmc-lib=XvMCW XVMC_LIB_DEPENDS= libXvMC.so:x11/libXvMC .endif XVMC_CONFIGURE_ENABLE= xvmc .include .if ${ARCH} == aarch64 BUILD_DEPENDS+= as:devel/binutils .endif .if !${PORT_OPTIONS:MGNUTLS} && !${PORT_OPTIONS:MOPENSSL} CONFIGURE_ARGS+= --disable-tls .endif post-patch: @${REINPLACE_CMD} -e '/xine_set_flags/s/XINE_PROTECTED//' \ ${WRKSRC}/include/xine.h .if ${COMPILER_TYPE} == "clang" @${REINPLACE_CMD} -e 's|-fno-rename-registers||' \ ${WRKSRC}/src/libw32dll/Makefile.in .endif post-patch-GNUTLS-off: @${REINPLACE_CMD} -e '/have_gnutls=/s|yes|no|' \ ${WRKSRC}/configure post-patch-WAYLAND-off: @${REINPLACE_CMD} -e '/have_vaapi_wayland=/s|yes|no|' \ ${WRKSRC}/configure post-install: @${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/*.so @${STRIP_CMD} ${STAGEDIR}${PREFIX}/${PLUGINSDIR}/*.so @${STRIP_CMD} ${STAGEDIR}${PREFIX}/${PLUGINSDIR}/post/*.so .include diff --git a/multimedia/libxine/files/0a786d63bbdb2d780a9231f6772e84e743c72014.patch b/multimedia/libxine/files/0a786d63bbdb2d780a9231f6772e84e743c72014.patch new file mode 100644 index 000000000000..d792fbc858df --- /dev/null +++ b/multimedia/libxine/files/0a786d63bbdb2d780a9231f6772e84e743c72014.patch @@ -0,0 +1,67 @@ +# HG changeset patch +# User Torsten Jager +# Date 1675683900 -3600 +# Mon Feb 06 12:45:00 2023 +0100 +# Node ID 0a786d63bbdb2d780a9231f6772e84e743c72014 +# Parent b0a36ed8ec8f3f2de545502b93ec846561168b64 +Try to silence some cast align warnings 4. + +diff -r b0a36ed8ec8f -r 0a786d63bbdb src/combined/ffmpeg/ff_video_decoder.c +--- a/src/combined/ffmpeg/ff_video_decoder.c Mon Feb 06 12:44:55 2023 +0100 ++++ b/src/combined/ffmpeg/ff_video_decoder.c Mon Feb 06 12:45:00 2023 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2001-2022 the xine project ++ * Copyright (C) 2001-2023 the xine project + * + * This file is part of xine, a free video player. + * +@@ -1398,7 +1398,7 @@ + #if defined(AV_PIX_FMT_YUV420P9) || defined(AV_PIX_FMT_YUV420P10) + static void ff_get_deep_color (uint8_t *src, int sstride, uint8_t *dest, int dstride, + int width, int height, uint8_t *tab) { +- uint16_t *p = (uint16_t *) src; ++ uint16_t *p = (uint16_t *)ASSUME_ALIGNED_2 (src, 2); + uint8_t *q = dest; + int spad = sstride / 2 - width; + int dpad = dstride - width; +@@ -1804,22 +1804,24 @@ + #ifdef XFF_AVCODEC_SUB_ID + this->context->sub_id = _X_BE_32(&this->buf[30]); + #endif +- this->context->extradata_size = this->size - 26; +- if (this->context->extradata_size < 8) { +- this->context->extradata_size= 8; +- this->context->extradata = calloc(1, this->context->extradata_size + +- AV_INPUT_BUFFER_PADDING_SIZE); +- ((uint32_t *)this->context->extradata)[0] = 0; +- if (codec_type == BUF_VIDEO_RV10) +- ((uint32_t *)this->context->extradata)[1] = 0x10000000; +- else +- ((uint32_t *)this->context->extradata)[1] = 0x10003001; ++ if (this->size < 8 + 26) { ++ uint32_t *b = calloc (1, 8 + AV_INPUT_BUFFER_PADDING_SIZE); ++ if (b) { ++ this->context->extradata_size = 8; ++ this->context->extradata = (uint8_t *)b; ++ b[0] = 0; ++ if (codec_type == BUF_VIDEO_RV10) ++ b[1] = 0x10000000; ++ else ++ b[1] = 0x10003001; ++ } + } else { +- this->context->extradata = malloc(this->context->extradata_size + +- AV_INPUT_BUFFER_PADDING_SIZE); +- memcpy(this->context->extradata, this->buf + 26, +- this->context->extradata_size); +- memset(this->context->extradata + this->context->extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE); ++ this->context->extradata = malloc (this->size - 26 + AV_INPUT_BUFFER_PADDING_SIZE); ++ if (this->context->extradata) { ++ this->context->extradata_size = this->size - 26; ++ memcpy (this->context->extradata, this->buf + 26, this->context->extradata_size); ++ memset (this->context->extradata + this->context->extradata_size, 0, AV_INPUT_BUFFER_PADDING_SIZE); ++ } + } + + xprintf(this->stream->xine, XINE_VERBOSITY_LOG, diff --git a/multimedia/libxine/files/1e7b184008860c8be2289c3cefd9dee57f06193a.patch b/multimedia/libxine/files/1e7b184008860c8be2289c3cefd9dee57f06193a.patch new file mode 100644 index 000000000000..b6b4040a8478 --- /dev/null +++ b/multimedia/libxine/files/1e7b184008860c8be2289c3cefd9dee57f06193a.patch @@ -0,0 +1,475 @@ +# HG changeset patch +# User Torsten Jager +# Date 1715025355 -7200 +# Mon May 06 21:55:55 2024 +0200 +# Node ID 1e7b184008860c8be2289c3cefd9dee57f06193a +# Parent d1954d852980ddc887a67a9f1a26626909561ff5 +ffmpeg compatibility update 1. + +diff -r d1954d852980 -r 1e7b18400886 src/combined/ffmpeg/ff_audio_decoder.c +--- a/src/combined/ffmpeg/ff_audio_decoder.c Mon Apr 08 13:25:10 2024 +0200 ++++ b/src/combined/ffmpeg/ff_audio_decoder.c Mon May 06 21:55:55 2024 +0200 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2001-2023 the xine project ++ * Copyright (C) 2001-2024 the xine project + * + * This file is part of xine, a free video player. + * +@@ -67,6 +67,7 @@ + + xine_t *xine; + float gain; ++ int bitexact; + } ff_audio_class_t; + + typedef struct ff_audio_decoder_s { +@@ -188,14 +189,25 @@ + xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, + "ffmpeg_audio_dec: found AAC ADTS syncword after %d bytes\n", i); + if (this->buftype == BUF_AUDIO_AAC_LATM) { ++ uint8_t *ed = NULL; ++ int es = 0; + xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, + "ffmpeg_audio_dec: stream says LATM but is ADTS -> switching decoders\n"); +- if (this->decoder_ok) { +- pthread_mutex_lock (&ffmpeg_lock); +- avcodec_close (this->context); +- pthread_mutex_unlock (&ffmpeg_lock); +- this->decoder_ok = 0; ++ pthread_mutex_lock (&ffmpeg_lock); ++ if (this->context) { ++ ed = this->context->extradata; ++ es = this->context->extradata_size; ++ this->context->extradata = NULL; ++ this->context->extradata_size = 0; ++ XFF_FREE_CONTEXT (this->context); + } ++ this->decoder_ok = 0; ++ this->context = XFF_ALLOC_CONTEXT (); ++ if (this->context) { ++ this->context->extradata = ed; ++ this->context->extradata_size = es; ++ } ++ pthread_mutex_unlock (&ffmpeg_lock); + this->codec = NULL; + ff_audio_open_codec (this, BUF_AUDIO_AAC); + } +@@ -349,6 +361,11 @@ + return -1; + } + ++ if (this->class->bitexact) ++ this->context->flags |= CODEC_FLAG_BITEXACT; ++ else ++ this->context->flags &= ~CODEC_FLAG_BITEXACT; ++ + pthread_mutex_lock (&ffmpeg_lock); + if (XFF_AVCODEC_OPEN (this->context, this->codec) < 0) { + pthread_mutex_unlock (&ffmpeg_lock); +@@ -1377,9 +1394,21 @@ + } + #endif + pthread_mutex_lock (&ffmpeg_lock); +- avcodec_close (this->context); +- if (XFF_AVCODEC_OPEN (this->context, this->codec) < 0) ++ { ++ uint8_t *ed = this->context->extradata; ++ int es = this->context->extradata_size; ++ this->context->extradata = NULL; ++ this->context->extradata_size = 0; ++ XFF_FREE_CONTEXT (this->context); + this->decoder_ok = 0; ++ this->context = XFF_ALLOC_CONTEXT (); ++ if (this->context) { ++ this->context->extradata = ed; ++ this->context->extradata_size = es; ++ } ++ } ++ if (XFF_AVCODEC_OPEN (this->context, this->codec) >= 0) ++ this->decoder_ok = 1; + pthread_mutex_unlock (&ffmpeg_lock); + } + +@@ -1418,20 +1447,20 @@ + XFF_FREE_FRAME (this->av_frame); + } + #endif +- pthread_mutex_lock (&ffmpeg_lock); +- avcodec_close (this->context); +- pthread_mutex_unlock (&ffmpeg_lock); + } ++ pthread_mutex_lock (&ffmpeg_lock); ++ if (this->context) { ++ _x_freep (&this->context->extradata); ++ this->context->extradata_size = 0; ++ XFF_FREE_CONTEXT (this->context); ++ } ++ pthread_mutex_unlock (&ffmpeg_lock); + + ff_audio_output_close(this); + + xine_free_aligned (this->buf); + xine_free_aligned (this->decode_buffer); + +- _x_freep (&this->context->extradata); +- this->context->extradata_size = 0; +- XFF_FREE_CONTEXT (this->context); +- + XFF_PACKET_UNREF (this->avpkt); + + xine_pts_queue_delete (&this->pts_queue); +@@ -1513,6 +1542,12 @@ + free (this); + } + ++static void ff_bitexact_cb (void *user_data, xine_cfg_entry_t *entry) { ++ ff_audio_class_t *class = (ff_audio_class_t *)user_data; ++ ++ class->bitexact = entry->num_value; ++} ++ + void *init_audio_plugin (xine_t *xine, const void *data) { + + ff_audio_class_t *this ; +@@ -1540,5 +1575,12 @@ + 10, ff_gain_cb, this) + / (float)20); + ++ this->bitexact = xine->config->register_bool (xine->config, ++ "audio.processing.ffmpeg_bitexact", 0, ++ _("Let FFmpeg use precise but slower math"), ++ _("Get slightly better sound, at the expense of speed.\n" ++ "Takes effect with next stream."), ++ 10, ff_bitexact_cb, this); ++ + return this; + } +diff -r d1954d852980 -r 1e7b18400886 src/combined/ffmpeg/ff_video_decoder.c +--- a/src/combined/ffmpeg/ff_video_decoder.c Mon Apr 08 13:25:10 2024 +0200 ++++ b/src/combined/ffmpeg/ff_video_decoder.c Mon May 06 21:55:55 2024 +0200 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2001-2023 the xine project ++ * Copyright (C) 2001-2024 the xine project + * + * This file is part of xine, a free video player. + * +@@ -128,6 +128,7 @@ + + int64_t pts; + int64_t last_pts; ++ int64_t tagged_pts; + int video_step; + int reported_video_step; + uint8_t pts_tag_pass; +@@ -551,7 +552,9 @@ + # ifdef XFF_FRAME_AGE + av_frame->age = 1; + # endif ++#ifdef XFF_AVCODEC_REORDERED_OPAQUE + av_frame->reordered_opaque = context->reordered_opaque; ++#endif + + ffsf = ffsf_new (this); + if (!ffsf) +@@ -862,7 +865,9 @@ + # endif + + /* take over pts for this frame to have it reordered */ ++#ifdef XFF_AVCODEC_REORDERED_OPAQUE + av_frame->reordered_opaque = context->reordered_opaque; ++#endif + + return 0; + } +@@ -1142,9 +1147,13 @@ + if (this->codec->id == CODEC_ID_VC1 && + (!this->bih.biWidth || !this->bih.biHeight)) { + /* VC1 codec must be re-opened with correct width and height. */ +- avcodec_close(this->context); +- +- if (XFF_AVCODEC_OPEN (this->context, this->codec) < 0) { ++ if (this->context) { ++ _x_freep (&this->context->extradata); ++ this->context->extradata_size = 0; ++ XFF_FREE_CONTEXT (this->context); ++ } ++ this->context = XFF_ALLOC_CONTEXT (); ++ if (!(this->context && XFF_AVCODEC_OPEN (this->context, this->codec) >= 0)) { + pthread_mutex_unlock(&ffmpeg_lock); + xprintf (this->stream->xine, XINE_VERBOSITY_LOG, + _("ffmpeg_video_dec: couldn't open decoder (pass 2)\n")); +@@ -1211,6 +1220,11 @@ + /* dont want initial AV_NOPTS_VALUE here */ + this->context->reordered_opaque = 0; + #endif ++ ++#ifdef XFF_AVCODEC_FRAME_PTS ++ this->context->time_base.num = 1; ++ this->context->time_base.den = 90000 << 8; ++#endif + } + + #ifdef ENABLE_VAAPI +@@ -1959,7 +1973,26 @@ + return (pts * 256) | this->pts_tag_pass; + } + +-static int64_t ff_untag_pts (ff_video_decoder_t *this, int64_t pts) { ++static int64_t ff_untag_pts (ff_video_decoder_t *this, AVFrame *av_frame) { ++ int64_t pts; ++#if defined(XFF_AVCODEC_FRAME_PTS) ++ pts = (av_frame->pts != AV_NOPTS_VALUE) ? av_frame->pts : 0; ++# if defined(XFF_AVCODEC_REORDERED_OPAQUE) ++ /* paranoia !!! */ ++ if (pts != av_frame->reordered_opaque) { ++ xprintf (this->stream->xine, XINE_VERBOSITY_DEBUG, ++ LOG_MODULE ": WARNING: frame pts %" PRId64 " != reordered_opaque %" PRId64 ".\n", ++ pts, av_frame->reordered_opaque); ++ pts = av_frame->reordered_opaque; ++ } ++ av_frame->reordered_opaque = 0; ++# endif ++#elif defined(XFF_AVCODEC_REORDERED_OPAQUE) ++ pts = av_frame->reordered_opaque; ++ av_frame->reordered_opaque = 0; ++#else ++ pts = this->tagged_pts; ++#endif + if ((uint8_t)(pts & 0xff) == this->pts_tag_pass) { + /* restore sign. */ + return pts >> 8; +@@ -1984,7 +2017,9 @@ + this->avpkt->data = buf; + this->avpkt->size = buf_size; + this->avpkt->flags = AV_PKT_FLAG_KEY; +- ++# ifdef XFF_AVCODEC_FRAME_PTS ++ this->avpkt->pts = this->tagged_pts; ++# endif + # if XFF_PALETTE == 2 || XFF_PALETTE == 3 + if (buf && this->palette_changed) { + uint8_t *sd = av_packet_new_side_data (this->avpkt, AV_PKT_DATA_PALETTE, 256 * 4); +@@ -2094,9 +2129,14 @@ + #endif + + /* apply valid pts to first frame _starting_ thereafter only */ +- if (this->pts && !this->context->reordered_opaque) { +- this->context->reordered_opaque = +- this->av_frame->reordered_opaque = ff_tag_pts (this, this->pts); ++ if (this->pts && !this->tagged_pts) { ++ this->tagged_pts = ff_tag_pts (this, this->pts); ++#ifdef XFF_AVCODEC_REORDERED_OPAQUE ++ this->context->reordered_opaque = this->av_frame->reordered_opaque = this->tagged_pts; ++#endif ++#ifdef XFF_AVCODEC_FRAME_PTS ++ this->av_frame->pts = this->tagged_pts; ++#endif + this->pts = 0; + } + +@@ -2207,9 +2247,11 @@ + img->top_field_first = this->av_frame->top_field_first; + + /* get back reordered pts */ +- img->pts = ff_untag_pts (this, this->av_frame->reordered_opaque); +- this->av_frame->reordered_opaque = 0; ++ img->pts = ff_untag_pts (this, this->av_frame); ++ this->tagged_pts = 0; ++#ifdef XFF_AVCODEC_REORDERED_OPAQUE + this->context->reordered_opaque = 0; ++#endif + + if (this->av_frame->repeat_pict) + img->duration = this->video_step * 3 / 2; +@@ -2330,9 +2372,14 @@ + } + + if (this->size == 0) { ++ this->tagged_pts = ff_tag_pts (this, this->pts); + /* take over pts when we are about to buffer a frame */ +- this->av_frame->reordered_opaque = ff_tag_pts(this, this->pts); +- this->context->reordered_opaque = ff_tag_pts(this, this->pts); ++#ifdef XFF_AVCODEC_REORDERED_OPAQUE ++ this->av_frame->reordered_opaque = this->context->reordered_opaque = this->tagged_pts; ++#endif ++#ifdef XFF_AVCODEC_FRAME_PTS ++ this->av_frame->pts = this->tagged_pts; ++#endif + this->pts = 0; + } + +@@ -2405,7 +2452,10 @@ + need_unref = 1; + #endif + /* reset consumed pts value */ +- this->context->reordered_opaque = ff_tag_pts(this, 0); ++ this->tagged_pts = ff_tag_pts (this, 0); ++#ifdef XFF_AVCODEC_REORDERED_OPAQUE ++ this->context->reordered_opaque = this->tagged_pts; ++#endif + + if (err) { + +@@ -2439,10 +2489,14 @@ + ff_check_bufsize(this, this->size); + memmove (this->buf, &chunk_buf[offset], this->size); + chunk_buf = this->buf; +- + /* take over pts for next access unit */ +- this->av_frame->reordered_opaque = ff_tag_pts(this, this->pts); +- this->context->reordered_opaque = ff_tag_pts(this, this->pts); ++ this->tagged_pts = ff_tag_pts (this, this->pts); ++#ifdef XFF_AVCODEC_REORDERED_OPAQUE ++ this->av_frame->reordered_opaque = this->context->reordered_opaque = this->tagged_pts; ++#endif ++#ifdef XFF_AVCODEC_FRAME_PTS ++ this->av_frame->pts = this->tagged_pts; ++#endif + this->pts = 0; + } + } +@@ -2559,8 +2613,7 @@ + ff_convert_frame(this, img, this->av_frame); + } + +- img->pts = ff_untag_pts(this, this->av_frame->reordered_opaque); +- this->av_frame->reordered_opaque = 0; ++ img->pts = ff_untag_pts(this, this->av_frame); + + /* workaround for weird 120fps streams */ + if( video_step_to_use == 750 ) { +@@ -2600,8 +2653,7 @@ + this->output_format, + VO_BOTH_FIELDS|this->frame_flags); + /* set PTS to allow early syncing */ +- img->pts = ff_untag_pts(this, this->av_frame->reordered_opaque); +- this->av_frame->reordered_opaque = 0; ++ img->pts = ff_untag_pts(this, this->av_frame); + + img->duration = video_step_to_use; + +@@ -2783,7 +2835,7 @@ + ff_convert_frame (this, img, this->av_frame2); + } + +- img->pts = ff_untag_pts (this, this->av_frame2->reordered_opaque); ++ img->pts = ff_untag_pts (this, this->av_frame2); + + if (video_step_to_use == 750) + video_step_to_use = 0; +@@ -2903,7 +2955,9 @@ + if (this->decoder_ok) { + + pthread_mutex_lock(&ffmpeg_lock); +- avcodec_close (this->context); ++ _x_freep (&this->context->extradata); ++ this->context->extradata_size = 0; ++ XFF_FREE_CONTEXT (this->context); + pthread_mutex_unlock(&ffmpeg_lock); + + #ifdef ENABLE_DIRECT_RENDERING +@@ -2912,16 +2966,15 @@ + + this->stream->video_out->close(this->stream->video_out, this->stream); + this->decoder_ok = 0; ++ } else if (this->context) { ++ _x_freep (&this->context->extradata); ++ this->context->extradata_size = 0; ++ XFF_FREE_CONTEXT (this->context); + } + + if (this->slice_offset_table) + free (this->slice_offset_table); + +- if (this->context) { +- _x_freep (&this->context->extradata); +- this->context->extradata_size = 0; +- XFF_FREE_CONTEXT (this->context); +- } + + #if XFF_VIDEO > 1 + XFF_PACKET_UNREF (this->avpkt); +diff -r d1954d852980 -r 1e7b18400886 src/combined/ffmpeg/ffmpeg_compat.h +--- a/src/combined/ffmpeg/ffmpeg_compat.h Mon Apr 08 13:25:10 2024 +0200 ++++ b/src/combined/ffmpeg/ffmpeg_compat.h Mon May 06 21:55:55 2024 +0200 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2000-2022 the xine project ++ * Copyright (C) 2000-2024 the xine project + * + * This file is part of xine, a unix video player. + * +@@ -54,9 +54,16 @@ + #endif + + /* reordered_opaque appeared in libavcodec 51.68.0 */ +-#define XFF_AVCODEC_REORDERED_OPAQUE +-#if LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(51,68,0) +-# undef XFF_AVCODEC_REORDERED_OPAQUE ++#if LIBAVCODEC_VERSION_INT >= XFF_INT_VERSION(51,68,0) && LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(60,0,0) ++# define XFF_AVCODEC_REORDERED_OPAQUE ++#else ++# undef XFF_AVCODEC_REORDERED_OPAQUE ++#endif ++ ++#if LIBAVCODEC_VERSION_INT >= XFF_INT_VERSION(58,33,100) ++# define XFF_AVCODEC_FRAME_PTS ++#else ++# undef XFF_AVCODEC_FRAME_PTS + #endif + + /* colorspace and color_range were added before 52.29.0 */ +@@ -210,9 +217,11 @@ + #endif + + #if LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(55,63,100) +-# define XFF_FREE_CONTEXT(pp) do {av_free(pp); pp = NULL;} while (0) ++# define XFF_FREE_CONTEXT(pp) do {if (pp) avcodec_close (pp); av_free (pp); pp = NULL;} while (0) ++#elif LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(58,33,100) ++# define XFF_FREE_CONTEXT(pp) do {if (pp) avcodec_close (pp); avcodec_free_context (&(pp));} while (0) + #else +-# define XFF_FREE_CONTEXT(pp) avcodec_free_context(&(pp)) ++# define XFF_FREE_CONTEXT(pp) avcodec_free_context (&(pp)) + #endif + + #if LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(54,59,100) +@@ -303,4 +312,3 @@ + #endif /* defined(LIBAVCODEC_VERSION_INT) */ + + #endif /* XINE_AVCODEC_COMPAT_H */ +- +diff -r d1954d852980 -r 1e7b18400886 src/dxr3/ffmpeg_encoder.c +--- a/src/dxr3/ffmpeg_encoder.c Mon Apr 08 13:25:10 2024 +0200 ++++ b/src/dxr3/ffmpeg_encoder.c Mon May 06 21:55:55 2024 +0200 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2000-2022 the xine project ++ * Copyright (C) 2000-2024 the xine project + * + * This file is part of xine, a unix video player. + * +@@ -127,10 +127,8 @@ + unsigned char use_quantizer; + + if (this->context) { +- avcodec_close(this->context); +- free(this->context); ++ XFF_FREE_CONTEXT (this->context); + free(this->picture); +- this->context = NULL; + this->picture = NULL; + } + +@@ -344,10 +342,8 @@ + #if XFF_ENCVIDEO > 1 + XFF_PACKET_UNREF (this->pkt); + #endif +- avcodec_close(this->context); + XFF_FREE_CONTEXT (this->context); + free(this->picture); +- this->context = NULL; + this->picture = NULL; + } + return 1; diff --git a/multimedia/libxine/files/6f1000084f6084f49c95c202d12593e49916f58b.patch b/multimedia/libxine/files/6f1000084f6084f49c95c202d12593e49916f58b.patch new file mode 100644 index 000000000000..36b07bb7e0a0 --- /dev/null +++ b/multimedia/libxine/files/6f1000084f6084f49c95c202d12593e49916f58b.patch @@ -0,0 +1,161 @@ +# HG changeset patch +# User Torsten Jager +# Date 1675683905 -3600 +# Mon Feb 06 12:45:05 2023 +0100 +# Node ID 6f1000084f6084f49c95c202d12593e49916f58b +# Parent 0a786d63bbdb2d780a9231f6772e84e743c72014 +Try to silence some cast align warnings 5. + +diff -r 0a786d63bbdb -r 6f1000084f60 src/combined/ffmpeg/ff_audio_decoder.c +--- a/src/combined/ffmpeg/ff_audio_decoder.c Mon Feb 06 12:45:00 2023 +0100 ++++ b/src/combined/ffmpeg/ff_audio_decoder.c Mon Feb 06 12:45:05 2023 +0100 +@@ -796,7 +796,7 @@ + #define CLIP_16(v) ((v + 0x8000) & ~0xffff ? (v >> 31) ^ 0x7fff : v) + + static int ff_audio_decode (ff_audio_decoder_t *this) { +- int16_t *decode_buffer = (int16_t *)this->send.buf; ++ int16_t *decode_buffer = (int16_t *)ASSUME_ALIGNED_2 (this->send.buf, 2); + int consumed, got_frame = 0; + #if XFF_AUDIO >= 4 + float gain = this->class->gain; +@@ -871,13 +871,13 @@ + const stype *p1, *p2, *p3, *p4;\ + int i, sstep;\ + int8_t *x = idx;\ +- int16_t *dptr = (int16_t *)decode_buffer + dindx;\ ++ int16_t *dptr = decode_buffer + dindx;\ + if (planar) {\ +- p1 = (stype *)this->av_frame->extended_data[x[0]];\ ++ p1 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[0]], sizeof (stype));\ + if (!p1) break;\ + sstep = 1;\ + } else {\ +- p1 = (stype *)this->av_frame->extended_data[0];\ ++ p1 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype));\ + if (!p1) break;\ + p1 += x[0];\ + sstep = this->ff_channels;\ +@@ -893,10 +893,10 @@ + break;\ + }\ + if (planar) {\ +- p2 = (stype *)this->av_frame->extended_data[x[1]];\ ++ p2 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[1]], sizeof (stype));\ + if (!p2) break;\ + } else\ +- p2 = (stype *)this->av_frame->extended_data[0] + x[1];\ ++ p2 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype)) + x[1];\ + if (num == 2) {\ + for (i = 0; i < samples; i++) {\ + int32_t v = MIX_FIX(*p2);\ +@@ -911,10 +911,10 @@ + break;\ + }\ + if (planar) {\ +- p3 = (stype *)this->av_frame->extended_data[x[2]];\ ++ p3 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[2]], sizeof (stype));\ + if (!p3) break;\ + } else\ +- p3 = (stype *)this->av_frame->extended_data[0] + x[2];\ ++ p3 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype)) + x[2];\ + if (num == 3) {\ + for (i = 0; i < samples; i++) {\ + int32_t v = MIX_FIX(*p2);\ +@@ -931,10 +931,10 @@ + break;\ + }\ + if (planar) {\ +- p4 = (stype *)this->av_frame->extended_data[x[3]];\ ++ p4 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[3]], sizeof (stype));\ + if (!p4) break;\ + } else\ +- p4 = (stype *)this->av_frame->extended_data[0] + x[3];\ ++ p4 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype)) + x[3];\ + for (i = 0; i < samples; i++) {\ + int32_t v = MIX_FIX(*p2);\ + p2 += sstep;\ +@@ -1003,13 +1003,13 @@ + int i, sstep;\ + float gain3;\ + int8_t *x = idx;\ +- int16_t *dptr = (int16_t *)decode_buffer + dindx;\ ++ int16_t *dptr = decode_buffer + dindx;\ + if (planar) {\ +- p1 = (stype *)this->av_frame->extended_data[x[0]];\ ++ p1 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[0]], sizeof (stype));\ + if (!p1) break;\ + sstep = 1;\ + } else {\ +- p1 = (stype *)this->av_frame->extended_data[0];\ ++ p1 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype));\ + if (!p1) break;\ + p1 += x[0];\ + sstep = this->ff_channels;\ +@@ -1025,10 +1025,10 @@ + }\ + gain3 = gain * 0.7071;\ + if (planar) {\ +- p2 = (stype *)this->av_frame->extended_data[x[1]];\ ++ p2 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[1]], sizeof (stype));\ + if (!p2) break;\ + } else\ +- p2 = (stype *)this->av_frame->extended_data[0] + x[1];\ ++ p2 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype)) + x[1];\ + if (num == 2) {\ + for (i = 0; i < samples; i++) {\ + int32_t v = (*p1) * gain + (*p2) * gain3;\ +@@ -1040,10 +1040,10 @@ + break;\ + }\ + if (planar) {\ +- p3 = (stype *)this->av_frame->extended_data[x[2]];\ ++ p3 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[2]], sizeof (stype));\ + if (!p3) break;\ + } else\ +- p3 = (stype *)this->av_frame->extended_data[0] + x[2];\ ++ p3 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype)) + x[2];\ + if (num == 3) {\ + for (i = 0; i < samples; i++) {\ + int32_t v = (*p1) * gain + (*p2 + *p3) * gain3;\ +@@ -1056,10 +1056,10 @@ + break;\ + }\ + if (planar) {\ +- p4 = (stype *)this->av_frame->extended_data[x[3]];\ ++ p4 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[x[3]], sizeof (stype));\ + if (!p4) break;\ + } else\ +- p4 = (stype *)this->av_frame->extended_data[0] + x[3];\ ++ p4 = (stype *)ASSUME_ALIGNED_2 (this->av_frame->extended_data[0], sizeof (stype)) + x[3];\ + for (i = 0; i < samples; i++) {\ + int32_t v = (*p1) * gain + (*p2 + *p3 + *p4) * gain3;\ + p1 += sstep;\ +@@ -1240,8 +1240,8 @@ + /* the above codecs output float samples, not 16-bit integers */ + int samples = this->send.len / sizeof(float); + float gain = this->class->gain; +- float *p = (float *)this->decode_buffer; +- int16_t *q = (int16_t *)this->decode_buffer; ++ float *p = (float *)ASSUME_ALIGNED_2 (this->decode_buffer, 4); ++ int16_t *q = (int16_t *)ASSUME_ALIGNED_2 (this->decode_buffer, 2); + int i; + for (i = samples; i; i--) { + int v = *p++ * gain; +@@ -1255,7 +1255,7 @@ + int samples = this->send.len / (this->ff_channels * 2); + int channels = this->ao_channels; + int ff_channels = this->ff_channels; +- int16_t *p = (int16_t *)this->decode_buffer; ++ int16_t *p = (int16_t *)ASSUME_ALIGNED_2 (this->decode_buffer, 2); + int16_t *q = p; + int shift = this->downmix_shift, i, j; + /* downmix mono output to stereo first */ +@@ -1300,7 +1300,7 @@ + } + /* final mono downmix */ + if (channels > this->ao_channels) { +- p = (int16_t *)this->decode_buffer; ++ p = (int16_t *)ASSUME_ALIGNED_2 (this->decode_buffer, 2); + q = p; + for (i = samples; i; i--) { + int v = *p++; diff --git a/multimedia/libxine/files/73b833e7fe356cd2d9490dda4ebc9bfe16fce958.patch b/multimedia/libxine/files/73b833e7fe356cd2d9490dda4ebc9bfe16fce958.patch new file mode 100644 index 000000000000..136750404be2 --- /dev/null +++ b/multimedia/libxine/files/73b833e7fe356cd2d9490dda4ebc9bfe16fce958.patch @@ -0,0 +1,318 @@ +# HG changeset patch +# User Torsten Jager +# Date 1715160885 -7200 +# Wed May 08 11:34:45 2024 +0200 +# Node ID 73b833e7fe356cd2d9490dda4ebc9bfe16fce958 +# Parent 1e7b184008860c8be2289c3cefd9dee57f06193a +ffmpeg compatibility update 2. + +diff -r 1e7b18400886 -r 73b833e7fe35 src/combined/ffmpeg/ff_audio_decoder.c +--- a/src/combined/ffmpeg/ff_audio_decoder.c Mon May 06 21:55:55 2024 +0200 ++++ b/src/combined/ffmpeg/ff_audio_decoder.c Wed May 08 11:34:45 2024 +0200 +@@ -1393,6 +1393,9 @@ + XFF_FREE_FRAME (this->av_frame); + } + #endif ++#if 1 ++ avcodec_flush_buffers (this->context); ++#else + pthread_mutex_lock (&ffmpeg_lock); + { + uint8_t *ed = this->context->extradata; +@@ -1410,6 +1413,7 @@ + if (XFF_AVCODEC_OPEN (this->context, this->codec) >= 0) + this->decoder_ok = 1; + pthread_mutex_unlock (&ffmpeg_lock); ++#endif + } + + ff_audio_reset_parser(this); +diff -r 1e7b18400886 -r 73b833e7fe35 src/combined/ffmpeg/ff_video_decoder.c +--- a/src/combined/ffmpeg/ff_video_decoder.c Mon May 06 21:55:55 2024 +0200 ++++ b/src/combined/ffmpeg/ff_video_decoder.c Wed May 08 11:34:45 2024 +0200 +@@ -89,6 +89,11 @@ + # define ENABLE_EMMS + #endif + ++/* ++#undef XFF_AVCODEC_SLICE_TABLE ++#define XFF_AVCODEC_SLICE_TABLE 1 ++*/ ++ + #define VIDEOBUFSIZE (128*1024) + #define SLICE_BUFFER_SIZE (1194*1024) + +@@ -148,11 +153,11 @@ + int bufsize; + int size; + int skipframes; +- ++#if XFF_AVCODEC_SLICE_TABLE == 1 + int *slice_offset_table; + int slice_offset_size; + int slice_offset_pos; +- ++#endif + AVFrame *av_frame; + AVFrame *av_frame2; + AVCodecContext *context; +@@ -238,6 +243,13 @@ + #if XFF_VIDEO > 1 + XFF_PACKET_DECL (avpkt); + #endif ++ ++#if XFF_AVCODEC_SLICE_TABLE == 2 ++ uint8_t *temp_buf; ++ uint32_t temp_size; ++ int slice_num; ++ uint8_t slice_table[1 + 256 * 8]; ++#endif + }; + + /* import color matrix names */ +@@ -1783,10 +1795,9 @@ + this->size += buf->size; + + if (buf->decoder_flags & BUF_FLAG_FRAME_END) { +- int codec_type; ++ uint32_t codec_type = buf->type & 0xFFFF0000; + + lprintf ("header complete\n"); +- codec_type = buf->type & 0xFFFF0000; + + if (buf->decoder_flags & BUF_FLAG_STDHEADER) { + +@@ -1912,33 +1923,44 @@ + #endif + } + else if (buf->decoder_info[1] == BUF_SPECIAL_RV_CHUNK_TABLE) { +- /* o dear. Multiple decoding threads use individual contexts. +- av_decode_video2 () does only copy the _pointer_ to the offsets, +- not the offsets themselves. So we must not overwrite anything +- that another thread has not yet read. */ +- int i, l, total; +- +- lprintf("BUF_SPECIAL_RV_CHUNK_TABLE\n"); +- l = buf->decoder_info[2] + 1; +- +- total = l * this->class->thread_count; +- if (total < SLICE_OFFSET_SIZE) +- total = SLICE_OFFSET_SIZE; +- if (total > this->slice_offset_size) { +- this->slice_offset_table = realloc (this->slice_offset_table, total * sizeof (int)); +- this->slice_offset_size = total; +- } +- +- if (this->slice_offset_pos + l > this->slice_offset_size) +- this->slice_offset_pos = 0; +- this->context->slice_offset = this->slice_offset_table + this->slice_offset_pos; +- this->context->slice_count = l; +- +- lprintf ("slice_count=%d\n", l); +- for (i = 0; i < l; i++) { +- this->slice_offset_table[this->slice_offset_pos++] = +- ((uint32_t *)buf->decoder_info_ptr[2])[(2 * i) + 1]; +- lprintf("slice_offset[%d]=%d\n", i, this->context->slice_offset[i]); ++ { ++#if XFF_AVCODEC_SLICE_TABLE == 1 ++ /* o dear. Multiple decoding threads use individual contexts. ++ * av_decode_video2 () does only copy the _pointer_ to the offsets, ++ * not the offsets themselves. So we must not overwrite anything ++ * that another thread has not yet read. */ ++ int i, l, total; ++ ++ lprintf("BUF_SPECIAL_RV_CHUNK_TABLE\n"); ++ l = buf->decoder_info[2] + 1; ++ ++ total = l * this->class->thread_count; ++ if (total < SLICE_OFFSET_SIZE) ++ total = SLICE_OFFSET_SIZE; ++ if (total > this->slice_offset_size) { ++ this->slice_offset_table = realloc (this->slice_offset_table, total * sizeof (int)); ++ this->slice_offset_size = total; ++ } ++ ++ if (this->slice_offset_pos + l > this->slice_offset_size) ++ this->slice_offset_pos = 0; ++ this->context->slice_offset = this->slice_offset_table + this->slice_offset_pos; ++ this->context->slice_count = l; ++ ++ lprintf ("slice_count=%d\n", l); ++ for (i = 0; i < l; i++) { ++ this->slice_offset_table[this->slice_offset_pos++] = ++ ((uint32_t *)buf->decoder_info_ptr[2])[(2 * i) + 1]; ++ lprintf("slice_offset[%d]=%d\n", i, this->context->slice_offset[i]); ++ } ++#elif XFF_AVCODEC_SLICE_TABLE == 2 ++ /* (count-1):1, 1:4, (offs[0]):4, 1:4, (offs[1]:4, ... just in front of the frame bitstream. ++ * reverse engineered from ffmpeg/libavcodec/rv34.c. they seem to expect no ++ * external use of rv decoders, and did not document this. */ ++ this->slice_table[0] = buf->decoder_info[2]; ++ this->slice_num = this->slice_table[0] + 1; ++ memcpy (this->slice_table + 1, buf->decoder_info_ptr[2], 8 * this->slice_num); ++#endif + } + } + } +@@ -2004,6 +2026,7 @@ + + static int decode_video_wrapper (ff_video_decoder_t *this, + AVFrame *av_frame, int *err, void *buf, size_t buf_size) { ++ uint32_t tsize = 0; + int len; + + #if ENABLE_VAAPI +@@ -2013,9 +2036,32 @@ + } + #endif /* ENABLE_VAAPI */ + ++#if XFF_AVCODEC_SLICE_TABLE == 2 ++ if ((this->slice_num > 0) && buf) { ++ uint32_t nsize; ++ tsize = 1 + this->slice_num * 8; ++ nsize = tsize + buf_size + AV_INPUT_BUFFER_PADDING_SIZE; ++ if (this->temp_size < nsize) { ++ nsize = nsize * 3 / 2; ++ free (this->temp_buf); ++ this->temp_buf = malloc (nsize); ++ if (!this->temp_buf) ++ nsize = 0; ++ this->temp_size = nsize; ++ nsize = tsize + buf_size + AV_INPUT_BUFFER_PADDING_SIZE; ++ } ++ if (this->temp_size >= nsize) { ++ memcpy (this->temp_buf, this->slice_table, tsize); ++ memcpy (this->temp_buf + tsize, buf, buf_size + AV_INPUT_BUFFER_PADDING_SIZE); ++ buf = this->temp_buf; ++ } ++ this->slice_num = 0; ++ } ++#endif ++ + #if XFF_VIDEO > 1 + this->avpkt->data = buf; +- this->avpkt->size = buf_size; ++ this->avpkt->size = buf_size + tsize; + this->avpkt->flags = AV_PKT_FLAG_KEY; + # ifdef XFF_AVCODEC_FRAME_PTS + this->avpkt->pts = this->tagged_pts; +@@ -2486,7 +2532,6 @@ + this->size -= len; + + if (this->size > 0) { +- ff_check_bufsize(this, this->size); + memmove (this->buf, &chunk_buf[offset], this->size); + chunk_buf = this->buf; + /* take over pts for next access unit */ +@@ -2615,8 +2660,8 @@ + + img->pts = ff_untag_pts(this, this->av_frame); + +- /* workaround for weird 120fps streams */ +- if( video_step_to_use == 750 ) { ++ /* workaround for weird 120fps streams, as well as some rv20 with frame duration 3pts. */ ++ if (video_step_to_use <= 750) { + /* fallback to the VIDEO_PTS_MODE */ + video_step_to_use = 0; + } +@@ -2837,7 +2882,7 @@ + + img->pts = ff_untag_pts (this, this->av_frame2); + +- if (video_step_to_use == 750) ++ if (video_step_to_use <= 750) + video_step_to_use = 0; + img->duration = this->av_frame2->repeat_pict ? video_step_to_use * 3 / 2 : video_step_to_use; + img->progressive_frame = !this->av_frame2->interlaced_frame; +@@ -2941,6 +2986,9 @@ + mpeg_parser_reset(this->mpeg_parser); + + /* this->pts_tag_pass = 0; */ ++#if XFF_AVCODEC_SLICE_TABLE == 2 ++ this->slice_num = 0; ++#endif + } + + static void ff_dispose (video_decoder_t *this_gen) { +@@ -2953,12 +3001,15 @@ + rgb2yuy2_free (this->rgb2yuy2); + + if (this->decoder_ok) { ++ uint8_t *ed; + + pthread_mutex_lock(&ffmpeg_lock); +- _x_freep (&this->context->extradata); ++ ed = this->context->extradata; ++ this->context->extradata = NULL; + this->context->extradata_size = 0; + XFF_FREE_CONTEXT (this->context); + pthread_mutex_unlock(&ffmpeg_lock); ++ _x_freep (&ed); + + #ifdef ENABLE_DIRECT_RENDERING + ff_free_dr1_frames (this, 1); +@@ -2972,9 +3023,11 @@ + XFF_FREE_CONTEXT (this->context); + } + +- if (this->slice_offset_table) +- free (this->slice_offset_table); +- ++#if XFF_AVCODEC_SLICE_TABLE == 1 ++ free (this->slice_offset_table); ++#elif XFF_AVCODEC_SLICE_TABLE == 2 ++ free (this->temp_buf); ++#endif + + #if XFF_VIDEO > 1 + XFF_PACKET_UNREF (this->avpkt); +@@ -3062,21 +3115,25 @@ + this->decoder_ok = 0; + this->aspect_ratio = 0; + this->pts_tag_pass = 0; +-#ifdef HAVE_POSTPROC ++# ifdef HAVE_POSTPROC + this->pp_quality = 0; + this->our_context = NULL; + this->our_mode = NULL; +-#endif ++# endif + this->mpeg_parser = NULL; + this->set_stream_info = 0; + this->rgb2yuy2 = NULL; +-#ifdef ENABLE_VAAPI ++# ifdef ENABLE_VAAPI + this->accel = NULL; + this->accel_img = NULL; +-#endif +-#if XFF_VIDEO == 3 ++# endif ++# if XFF_VIDEO == 3 + this->flush_packet_sent = 0; +-#endif ++# endif ++# if XFF_AVCODEC_SLICE_TABLE == 2 ++ this->temp_size = 0; ++ this->temp_buf = NULL; ++# endif + #endif + + this->video_decoder.decode_data = ff_decode_data; +diff -r 1e7b18400886 -r 73b833e7fe35 src/combined/ffmpeg/ffmpeg_compat.h +--- a/src/combined/ffmpeg/ffmpeg_compat.h Mon May 06 21:55:55 2024 +0200 ++++ b/src/combined/ffmpeg/ffmpeg_compat.h Wed May 08 11:34:45 2024 +0200 +@@ -139,6 +139,14 @@ + # define XFF_PALETTE 3 + #endif + ++#if LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(59,42,100) ++/* AVCodecContext.slice_{offset,count} */ ++# define XFF_AVCODEC_SLICE_TABLE 1 ++#else ++/* inline offset table before the frame. */ ++# define XFF_AVCODEC_SLICE_TABLE 2 ++#endif ++ + #if LIBAVCODEC_VERSION_INT < XFF_INT_VERSION(59,0,100) /** << revise this */ + # define XFF_VAAPI 1 /** << libavcodec/vaapi.h */ + #else diff --git a/multimedia/libxine/files/patch-src_combined_ffmpeg_ff__audio__decoder.c b/multimedia/libxine/files/771f4ae27e582123ff3500444718fc8f96186d74.patch similarity index 66% rename from multimedia/libxine/files/patch-src_combined_ffmpeg_ff__audio__decoder.c rename to multimedia/libxine/files/771f4ae27e582123ff3500444718fc8f96186d74.patch index 2108a84e9540..11056aa8cdbf 100644 --- a/multimedia/libxine/files/patch-src_combined_ffmpeg_ff__audio__decoder.c +++ b/multimedia/libxine/files/771f4ae27e582123ff3500444718fc8f96186d74.patch @@ -1,152 +1,196 @@ ---- src/combined/ffmpeg/ff_audio_decoder.c.orig 2022-09-08 21:43:29 UTC -+++ src/combined/ffmpeg/ff_audio_decoder.c +# HG changeset patch +# User Torsten Jager +# Date 1674929040 -3600 +# Sat Jan 28 19:04:00 2023 +0100 +# Node ID 771f4ae27e582123ff3500444718fc8f96186d74 +# Parent 250f1c09f4244c3e7ca7d414410c57bd387792c3 +ffmpeg compatibility update. + +diff -r 250f1c09f424 -r 771f4ae27e58 src/combined/ffmpeg/demux_avformat.c +--- a/src/combined/ffmpeg/demux_avformat.c Wed Jan 25 17:03:55 2023 +0100 ++++ b/src/combined/ffmpeg/demux_avformat.c Sat Jan 28 19:04:00 2023 +0100 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2013-2022 the xine project ++ * Copyright (C) 2013-2023 the xine project + * Copyright (C) 2013-2020 Petri Hintukainen + * + * This file is part of xine, a free video player. +@@ -423,8 +423,13 @@ + } + + #ifdef XFF_CODECPAR ++# if XFF_AUDIO_CHANNEL_LAYOUT < 2 + if (st->codecpar && st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && + st->codecpar->sample_rate != 0 && st->codecpar->channels != 0) ++# else ++ if (st->codecpar && st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && ++ st->codecpar->sample_rate != 0 && st->codecpar->ch_layout.nb_channels != 0) ++# endif + #else + if (st->codec && st->codec->codec_type == AVMEDIA_TYPE_AUDIO && + st->codec->sample_rate != 0 && st->codec->channels != 0) +@@ -501,7 +506,11 @@ + buf->size = extradata_size + sizeof(xine_waveformatex); + buf->decoder_info[1] = ctx->sample_rate; + buf->decoder_info[2] = ctx->bits_per_coded_sample; ++#if XFF_AUDIO_CHANNEL_LAYOUT < 2 + buf->decoder_info[3] = ctx->channels; ++#else ++ buf->decoder_info[3] = ctx->ch_layout.nb_channels; ++#endif + buf->decoder_flags = BUF_FLAG_HEADER | BUF_FLAG_STDHEADER | BUF_FLAG_FRAME_END; + + this->stream->audio_fifo->put (this->stream->audio_fifo, buf); +diff -r 250f1c09f424 -r 771f4ae27e58 src/combined/ffmpeg/ff_audio_decoder.c +--- a/src/combined/ffmpeg/ff_audio_decoder.c Wed Jan 25 17:03:55 2023 +0100 ++++ b/src/combined/ffmpeg/ff_audio_decoder.c Sat Jan 28 19:04:00 2023 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (C) 2001-2022 the xine project + * Copyright (C) 2001-2023 the xine project * * This file is part of xine, a free video player. * -@@ -303,7 +303,11 @@ static void ff_audio_init_codec(ff_audio_decoder_t *th +@@ -303,7 +303,11 @@ this->context->bits_per_sample = this->ff_bits; this->context->sample_rate = this->ff_sample_rate; +#if XFF_AUDIO_CHANNEL_LAYOUT < 2 this->context->channels = this->ff_channels; +#else + this->context->ch_layout.nb_channels = this->ff_channels; +#endif this->context->codec_id = this->codec->id; this->context->codec_type = this->codec->type; this->context->codec_tag = _x_stream_info_get(this->stream, XINE_STREAM_INFO_AUDIO_FOURCC); -@@ -527,17 +531,76 @@ static void ff_audio_output_close(ff_audio_decoder_t * +@@ -527,16 +531,75 @@ this->ao_mode = 0; } +static unsigned int ff_list_channels (uint8_t *list, uint64_t map) { + unsigned int n, bit; + + for (n = bit = 0; map; map >>= 1, bit++) { + uint32_t b = map & 1; + + list[n] = bit; + n += b; + } + return n; +} + static void ff_map_channels (ff_audio_decoder_t *this) { uint64_t ff_map; + uint8_t ff_list[64]; + unsigned int ff_num; + const char *type = "native"; int caps = this->stream->audio_out->get_capabilities (this->stream->audio_out); +#if XFF_AUDIO_CHANNEL_LAYOUT < 2 + /* safety kludge for very old libavcodec */ -#ifdef AV_CH_FRONT_LEFT +# ifdef AV_CH_FRONT_LEFT ff_map = this->context->channel_layout; if (!ff_map) /* wma2 bug */ --#endif +# endif - ff_map = ((uint64_t)1 << this->context->channels) - 1; ++ ff_map = ((uint64_t)1 << this->context->channels) - 1; + ff_num = ff_list_channels (ff_list, ff_map); - ++ +#else /* XFF_AUDIO_CHANNEL_LAYOUT == 2 */ + + ff_num = this->context->ch_layout.nb_channels; + if (ff_num > (int)(sizeof (ff_list) / sizeof (ff_list[0]))) + ff_num = sizeof (ff_list) / sizeof (ff_list[0]); + switch (this->context->ch_layout.order) { + const AVChannelCustom *cmap; + unsigned int i; + + case AV_CHANNEL_ORDER_UNSPEC: + type = "unknown"; + goto _fallback; + + case AV_CHANNEL_ORDER_NATIVE: + ff_map = this->context->ch_layout.u.mask; + if (!ff_map) /* wma2 bug */ + ff_map = ((uint64_t)1 << ff_num) - 1; + ff_num = ff_list_channels (ff_list, ff_map); + break; + + case AV_CHANNEL_ORDER_CUSTOM: + type = "custom"; + if (!(cmap = this->context->ch_layout.u.map)) + goto _fallback; + ff_map = 0; + for (i = 0; i < ff_num; i++) { + ff_list[i] = cmap[i].id; + ff_map |= (uint64_t)1 << ff_list[i]; + } + break; + + default: + type = "unsupported"; + /* fall through */ + _fallback: + ff_map = ((uint64_t)1 << ff_num) - 1; + ff_num = ff_list_channels (ff_list, ff_map); + } + -+#endif -+ + #endif +- ff_map = ((uint64_t)1 << this->context->channels) - 1; + if ((caps != this->ao_caps) || (ff_map != this->ff_map)) { unsigned int i, j; - /* ff: see names[] below; xine: L R RL RR C LFE */ -@@ -562,7 +625,7 @@ static void ff_map_channels (ff_audio_decoder_t *this) +@@ -562,7 +625,7 @@ this->ao_caps = caps; this->ff_map = ff_map; - this->ff_channels = this->context->channels; + this->ff_channels = ff_num; /* silence out */ for (i = 0; i < MAX_CHANNELS; i++) -@@ -576,20 +639,23 @@ static void ff_map_channels (ff_audio_decoder_t *this) +@@ -576,20 +639,23 @@ this->left[0] = this->right[0] = 0; tries = wishlist + 0 * num_modes; } else if (this->ff_channels == 2) { /* stereo */ + /* FIXME: libxine does not yet support audio selection _after_ decoding. + * For now, treat the most common "dual mono" case as stereo. */ name_map[0] = 0; name_map[1] = 1; this->left[0] = 0; this->right[0] = 1; tries = wishlist + 1 * num_modes; } else { - for (i = j = 0; i < sizeof (base_map) / sizeof (base_map[0]); i++) { - if ((ff_map >> i) & 1) { - int8_t target = base_map[i]; - if ((target >= 0) && (this->map[target] < 0)) - this->map[target] = j; - name_map[j] = i; /* for debug output below */ - j++; - } + for (i = 0; i < ff_num; i++) { + int8_t target; + uint32_t num = ff_list[i]; + if (num >= sizeof (base_map) / sizeof (base_map[0])) + continue; + target = base_map[num]; + if ((target >= 0) && (this->map[target] < 0)) + this->map[target] = i; + name_map[i] = num; /* for debug output below */ } this->left[0] = this->map[0] < 0 ? 0 : this->map[0]; this->map[0] = -1; -@@ -641,8 +707,8 @@ static void ff_map_channels (ff_audio_decoder_t *this) +@@ -641,8 +707,8 @@ "rear center", "side left", "side right" }; - int8_t buf[200]; - int p = sprintf (buf, "ff_audio_dec: channel layout: "); + int8_t buf[256]; + int p = sprintf (buf, "ff_audio_dec: %s channel layout: ", type); int8_t *indx = this->left; for (i = 0; i < 2; i++) { buf[p++] = '['; diff --git a/multimedia/libxine/files/ffmpeg8-1.patch b/multimedia/libxine/files/9bb3977ea7e2b652742b3cdd200b0a4a72eb48bc.patch similarity index 93% rename from multimedia/libxine/files/ffmpeg8-1.patch rename to multimedia/libxine/files/9bb3977ea7e2b652742b3cdd200b0a4a72eb48bc.patch index be5805b82061..1b5b5aa78e3f 100644 --- a/multimedia/libxine/files/ffmpeg8-1.patch +++ b/multimedia/libxine/files/9bb3977ea7e2b652742b3cdd200b0a4a72eb48bc.patch @@ -1,114 +1,128 @@ # HG changeset patch # User Torsten Jager # Date 1757753985 -7200 # Sat Sep 13 10:59:45 2025 +0200 # Node ID 9bb3977ea7e2b652742b3cdd200b0a4a72eb48bc # Parent 9e326869fe0faf21957642c8c7c5cac9ed4f445c FFmpeg compatibilty update. diff -r 9e326869fe0f -r 9bb3977ea7e2 src/combined/ffmpeg/ff_video_decoder.c --- a/src/combined/ffmpeg/ff_video_decoder.c Sat May 31 15:55:00 2025 +0200 +++ b/src/combined/ffmpeg/ff_video_decoder.c Sat Sep 13 10:59:45 2025 +0200 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2001-2024 the xine project ++ * Copyright (C) 2001-2025 the xine project + * + * This file is part of xine, a free video player. + * @@ -60,6 +60,10 @@ #include "ffmpeg_compat.h" +#if XFF_FRAME_RATE == 2 +# include +#endif + #if LIBAVCODEC_VERSION_INT >= XFF_INT_VERSION(59,0,100) # undef HAVE_POSTPROC #endif @@ -2289,8 +2293,8 @@ } /* transfer some more frame settings for deinterlacing */ - img->progressive_frame = !this->av_frame->interlaced_frame; - img->top_field_first = this->av_frame->top_field_first; + img->progressive_frame = !XFF_FRAME_IS_INTERLACED (this->av_frame); + img->top_field_first = !!XFF_FRAME_IS_TOP_FIELD_FIRST (this->av_frame); /* get back reordered pts */ img->pts = ff_untag_pts (this, this->av_frame); @@ -2370,20 +2374,29 @@ static int ff_video_step_get (ff_video_decoder_t *this) { /* use externally provided video_step or fall back to stream's time_base otherwise */ - int step = this->video_step; + int step = this->video_step, num_fields; if (step || !this->context->time_base.den) return step; +#if XFF_FRAME_RATE == 1 + num_fields = this->context->ticks_per_frame; +#else /* XFF_FRAME_RATE == 2 */ + { + const AVCodecDescriptor *desc = avcodec_descriptor_get (this->context->codec_id); + if (desc) + num_fields = (desc->props & AV_CODEC_PROP_FIELDS) ? 2 : 1; + else + num_fields = 2; + } +#endif /* good: 2 * 1001 / 48000. */ - step = (int64_t)90000 * this->context->ticks_per_frame - * this->context->time_base.num / this->context->time_base.den; + step = (int64_t)90000 * num_fields * this->context->time_base.num / this->context->time_base.den; if (step >= 90) return step; /* bad: 2 * 1 / 60000. seen this once from broken h.264 video usability info (VUI). * VAAPI seems to apply a similar HACK.*/ - step = (int64_t)90000000 * this->context->ticks_per_frame - * this->context->time_base.num / this->context->time_base.den; + step = (int64_t)90000000 * num_fields * this->context->time_base.num / this->context->time_base.den; return step; } @@ -2680,8 +2693,8 @@ img->duration = video_step_to_use; /* transfer some more frame settings for deinterlacing */ - img->progressive_frame = !this->av_frame->interlaced_frame; - img->top_field_first = this->av_frame->top_field_first; + img->progressive_frame = !XFF_FRAME_IS_INTERLACED (this->av_frame); + img->top_field_first = !!XFF_FRAME_IS_TOP_FIELD_FIRST (this->av_frame); this->skipframes = img->draw(img, this->stream); this->state = STATE_FRAME_SENT; @@ -2894,8 +2907,8 @@ if (video_step_to_use <= 750) video_step_to_use = 0; img->duration = this->av_frame2->repeat_pict ? video_step_to_use * 3 / 2 : video_step_to_use; - img->progressive_frame = !this->av_frame2->interlaced_frame; - img->top_field_first = this->av_frame2->top_field_first; + img->progressive_frame = !XFF_FRAME_IS_INTERLACED (this->av_frame2); + img->top_field_first = !!XFF_FRAME_IS_TOP_FIELD_FIRST (this->av_frame2); this->skipframes = img->draw (img, this->stream); if (free_img) diff -r 9e326869fe0f -r 9bb3977ea7e2 src/combined/ffmpeg/ffmpeg_compat.h --- a/src/combined/ffmpeg/ffmpeg_compat.h Sat May 31 15:55:00 2025 +0200 +++ b/src/combined/ffmpeg/ffmpeg_compat.h Sat Sep 13 10:59:45 2025 +0200 +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2000-2024 the xine project ++ * Copyright (C) 2000-2025 the xine project + * + * This file is part of xine, a unix video player. + * @@ -319,4 +319,20 @@ # error avcodec.h must be included first ! #endif /* defined(LIBAVCODEC_VERSION_INT) */ +#if LIBAVUTIL_VERSION_INT >= XFF_INT_VERSION(58,7,0) +# define XFF_FRAME_IS_INTERLACED(_frame) ((_frame)->flags & AV_FRAME_FLAG_INTERLACED) +# define XFF_FRAME_IS_TOP_FIELD_FIRST(_frame) ((_frame)->flags & AV_FRAME_FLAG_TOP_FIELD_FIRST) +# define XFF_FRAME_IS_KEY(_frame) ((_frame)->flags & AV_FRAME_FLAG_KEY) +#else +# define XFF_FRAME_IS_INTERLACED(_frame) ((_frame)->interlaced_frame) +# define XFF_FRAME_IS_TOP_FIELD_FIRST(_frame) ((_frame)->top_field_first) +# define XFF_FRAME_IS_KEY(_frame) ((_frame)->key_frame) +#endif + +#if LIBAVCODEC_VERSION_INT >= XFF_INT_VERSION(60,0,0) +# define XFF_FRAME_RATE 2 /* AV_CODEC_PROP_FIELDS */ +#else +# define XFF_FRAME_RATE 1 /* AVCodecContext.ticks_per_frame */ +#endif + #endif /* XINE_AVCODEC_COMPAT_H */ diff --git a/multimedia/libxine/files/ffmpeg8-2.patch b/multimedia/libxine/files/a8fffd1193b2247c7f732d4df83dcc03fce96dbe.patch similarity index 100% rename from multimedia/libxine/files/ffmpeg8-2.patch rename to multimedia/libxine/files/a8fffd1193b2247c7f732d4df83dcc03fce96dbe.patch diff --git a/multimedia/libxine/files/patch-src_combined_ffmpeg_demux__avformat.c b/multimedia/libxine/files/patch-src_combined_ffmpeg_demux__avformat.c deleted file mode 100644 index 954c65f363e8..000000000000 --- a/multimedia/libxine/files/patch-src_combined_ffmpeg_demux__avformat.c +++ /dev/null @@ -1,35 +0,0 @@ ---- src/combined/ffmpeg/demux_avformat.c.orig 2022-09-08 21:43:29 UTC -+++ src/combined/ffmpeg/demux_avformat.c -@@ -1,5 +1,5 @@ - /* -- * Copyright (C) 2013-2022 the xine project -+ * Copyright (C) 2013-2023 the xine project - * Copyright (C) 2013-2020 Petri Hintukainen - * - * This file is part of xine, a free video player. -@@ -423,8 +423,13 @@ static int find_avformat_streams(avformat_demux_plugin - } - - #ifdef XFF_CODECPAR -+# if XFF_AUDIO_CHANNEL_LAYOUT < 2 - if (st->codecpar && st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && - st->codecpar->sample_rate != 0 && st->codecpar->channels != 0) -+# else -+ if (st->codecpar && st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && -+ st->codecpar->sample_rate != 0 && st->codecpar->ch_layout.nb_channels != 0) -+# endif - #else - if (st->codec && st->codec->codec_type == AVMEDIA_TYPE_AUDIO && - st->codec->sample_rate != 0 && st->codec->channels != 0) -@@ -501,7 +506,11 @@ static void send_headers_audio(avformat_demux_plugin_t - buf->size = extradata_size + sizeof(xine_waveformatex); - buf->decoder_info[1] = ctx->sample_rate; - buf->decoder_info[2] = ctx->bits_per_coded_sample; -+#if XFF_AUDIO_CHANNEL_LAYOUT < 2 - buf->decoder_info[3] = ctx->channels; -+#else -+ buf->decoder_info[3] = ctx->ch_layout.nb_channels; -+#endif - buf->decoder_flags = BUF_FLAG_HEADER | BUF_FLAG_STDHEADER | BUF_FLAG_FRAME_END; - - this->stream->audio_fifo->put (this->stream->audio_fifo, buf);