diff --git a/libxine-1.2.13-configure-c99.patch b/libxine-1.2.13-configure-c99.patch
new file mode 100644
index 0000000..a6bf2e6
--- /dev/null
+++ b/libxine-1.2.13-configure-c99.patch
@@ -0,0 +1,116 @@
+configure: Add fake prototypes for C99 compatibility
+
+The xxmc-related configure probes assume that the compiler
+supports implicit function declarations because it tries to
+call the functions without including the appropriate headers,
+for link testing.
+
+As the headers are not determined yet at this point, use
+a fake prototype (the same that autoconf uses) to avoid
+the implicit function declarations.
+
+This avoids altering the outcome of these checks with future
+compilers which do not support implicit function declarations.
+
+Submitted upstream:
+
+
+
+diff --git a/configure b/configure
+index a4009e857777b5cf..3a83b40efda8fd5d 100755
+--- a/configure
++++ b/configure
+@@ -28563,7 +28563,7 @@ $as_echo "" >&6; }
+ LIBS="$XXMC_LIBS $X_LIBS $XV_LIBS $LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+-
++char XvMCPutSlice(void);
+ int
+ main ()
+ {
+@@ -28578,7 +28578,7 @@ else
+ LIBS="$XXMC_LIBS -lXvMC $X_LIBS $XV_LIBS $LIBS $DYNAMIC_LD_LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+-
++char XvMCPutSlice(void);
+ int
+ main ()
+ {
+@@ -28616,7 +28616,7 @@ done
+ else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+-
++char XvMCCreateContext(void);
+ int
+ main ()
+ {
+@@ -28631,7 +28631,7 @@ else
+ LIBS="$XXMC_LIBS -lXvMC $X_LIBS $XV_LIBS $LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+-
++char XvMCCreateContext(void);
+ int
+ main ()
+ {
+@@ -28675,7 +28675,7 @@ $as_echo "" >&6; }
+ LIBS="$XVMC_LIBS $X_LIBS $XV_LIBS $LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+-
++char XvMCCreateContext(void);
+ int
+ main ()
+ {
+@@ -28690,7 +28690,7 @@ else
+ LIBS="$XVMC_LIBS -lXvMC $X_LIBS $XV_LIBS $LIBS $DYNAMIC_LD_LIBS"
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+ /* end confdefs.h. */
+-
++char XvMCCreateContext(void);
+ int
+ main ()
+ {
+diff --git a/m4/video_out.m4 b/m4/video_out.m4
+index 150b477697297c03..8aa1f4a3b9267ff9 100644
+--- a/m4/video_out.m4
++++ b/m4/video_out.m4
+@@ -496,9 +496,9 @@ AC_DEFUN([XINE_VIDEO_OUT_PLUGINS], [
+ AC_MSG_CHECKING([whether to enable the xxmc plugin with VLD extensions])
+ AC_MSG_RESULT([])
+ LIBS="$XXMC_LIBS $X_LIBS $XV_LIBS $LIBS"
+- AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[XvMCPutSlice()]])], [have_xxmc=yes],
++ AC_LINK_IFELSE([AC_LANG_PROGRAM([[char XvMCPutSlice(void);]], [[XvMCPutSlice()]])], [have_xxmc=yes],
+ [LIBS="$XXMC_LIBS -lXvMC $X_LIBS $XV_LIBS $LIBS $DYNAMIC_LD_LIBS"
+- AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[XvMCPutSlice()]])],
++ AC_LINK_IFELSE([AC_LANG_PROGRAM([[char XvMCPutSlice(void);]], [[XvMCPutSlice()]])],
+ [have_xxmc=yes XXMC_LIBS="$XXMC_LIBS -lXvMC"])])
+ if test x"$have_xxmc" = x"yes"; then
+ AC_CHECK_HEADERS([X11/extensions/vldXvMC.h],
+@@ -506,9 +506,9 @@ AC_DEFUN([XINE_VIDEO_OUT_PLUGINS], [
+ AC_DEFINE([HAVE_VLDXVMC], 1, [Define if you have vldXvMC.h])],
+ [have_vldexts=no])
+ else
+- AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[XvMCCreateContext()]])], [have_xxmc=yes],
++ AC_LINK_IFELSE([AC_LANG_PROGRAM([[char XvMCCreateContext(void);]], [[XvMCCreateContext()]])], [have_xxmc=yes],
+ [LIBS="$XXMC_LIBS -lXvMC $X_LIBS $XV_LIBS $LIBS"
+- AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[XvMCCreateContext()]])],
++ AC_LINK_IFELSE([AC_LANG_PROGRAM([[char XvMCCreateContext(void);]], [[XvMCCreateContext()]])],
+ [have_xxmc=yes XXMC_LIBS="$XXMC_LIBS -lXvMC"])])
+ fi
+ if test x"$have_xxmc" = x"yes"; then
+@@ -521,9 +521,9 @@ AC_DEFUN([XINE_VIDEO_OUT_PLUGINS], [
+ AC_MSG_CHECKING([whether to enable the xvmc plugin])
+ AC_MSG_RESULT([])
+ LIBS="$XVMC_LIBS $X_LIBS $XV_LIBS $LIBS"
+- AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[XvMCCreateContext()]])], [have_xvmc=yes],
++ AC_LINK_IFELSE([AC_LANG_PROGRAM([[char XvMCCreateContext(void);]], [[XvMCCreateContext()]])], [have_xvmc=yes],
+ [LIBS="$XVMC_LIBS -lXvMC $X_LIBS $XV_LIBS $LIBS $DYNAMIC_LD_LIBS"
+- AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], [[XvMCCreateContext()]])],
++ AC_LINK_IFELSE([AC_LANG_PROGRAM([[char XvMCCreateContext(void);]], [[XvMCCreateContext()]])],
+ [have_xvmc=yes XVMC_LIBS="$XVMC_LIBS -lXvMC"])])
+ if test x"$have_xvmc" = x"yes"; then
+ AC_CHECK_HEADERS([X11/extensions/XvMC.h], [], [have_xvmc=no])
diff --git a/libxine-1.2.13-ffmpeg6-compatibility.patch b/libxine-1.2.13-ffmpeg6-compatibility.patch
new file mode 100644
index 0000000..11056aa
--- /dev/null
+++ b/libxine-1.2.13-ffmpeg6-compatibility.patch
@@ -0,0 +1,196 @@
+# 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 @@
+
+ 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,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
++ 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
+- ff_map = ((uint64_t)1 << this->context->channels) - 1;
+
+ if ((caps != this->ao_caps) || (ff_map != this->ff_map)) {
+ unsigned int i, j;
+@@ -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 @@
+ 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 @@
+ "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/libxine-1.2.13-ffmpeg6-compatibility_2.patch b/libxine-1.2.13-ffmpeg6-compatibility_2.patch
new file mode 100644
index 0000000..d5003ca
--- /dev/null
+++ b/libxine-1.2.13-ffmpeg6-compatibility_2.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-2022 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/libxine-1.2.13-ffmpeg7-compatibility.patch b/libxine-1.2.13-ffmpeg7-compatibility.patch
new file mode 100644
index 0000000..1367504
--- /dev/null
+++ b/libxine-1.2.13-ffmpeg7-compatibility.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/libxine.spec b/libxine.spec
index 37d4b6d..36ce07f 100644
--- a/libxine.spec
+++ b/libxine.spec
@@ -2,7 +2,7 @@
Name: libxine
Version: 1.2.13
-Release: 2mamba
+Release: 3mamba
Epoch: 2
Summary: A free multimedia player. It plays back CDs, DVDs, and VCDs
Group: System/Libraries
@@ -11,13 +11,15 @@ Distribution: openmamba
Packager: Silvan Calarco
URL: http://xinehq.de
Source: http://downloads.sourceforge.net/sourceforge/xine/%{pkgname}-%{version}.tar.xz
+Patch0: libxine-1.2.13-ffmpeg6-compatibility.patch
+Patch1: libxine-1.2.13-ffmpeg6-compatibility_2.patch
+Patch2: libxine-1.2.13-ffmpeg7-compatibility.patch
+Patch3: libxine-1.2.13-configure-c99.patch
License: GPL
## AUTOBUILDREQ-BEGIN
BuildRequires: glibc-devel
-BuildRequires: libGConf-devel
BuildRequires: libICE-devel
BuildRequires: libMagick-devel
-BuildRequires: libORBit2-devel
BuildRequires: libSM-devel
BuildRequires: libX11-devel
BuildRequires: libXext-devel
@@ -32,42 +34,32 @@ BuildRequires: libavcodec-ffmpeg-devel
BuildRequires: libavformat-ffmpeg-devel
BuildRequires: libavutil-ffmpeg-devel
BuildRequires: libbluray-devel
-BuildRequires: libbzip2-devel
BuildRequires: libcaca-devel
BuildRequires: libcdio-devel
BuildRequires: libdav1d-devel
-BuildRequires: libdbus-glib-devel
BuildRequires: libdca-devel
BuildRequires: libdirectfb-devel
BuildRequires: libdvdnav-devel
BuildRequires: libdvdread-devel
-BuildRequires: libfaad2-devel
-BuildRequires: libfame-devel
BuildRequires: libflac-devel
-BuildRequires: libfreeglut-devel
-BuildRequires: libftgl-devel
BuildRequires: libgcrypt-devel
BuildRequires: libgdk-pixbuf-devel
BuildRequires: libglib-devel
BuildRequires: libglu-devel
BuildRequires: libglvnd-devel
-BuildRequires: libgnome-vfs-devel
BuildRequires: libgnutls-devel
BuildRequires: libgomp-devel
BuildRequires: libgpm-devel
-BuildRequires: libgraphite2-devel
BuildRequires: libjack-devel
BuildRequires: libjpeg-devel
BuildRequires: libmad-devel
BuildRequires: libmng-devel
BuildRequires: libmodplug-devel
BuildRequires: libmusepack-devel
-BuildRequires: libncurses-devel
BuildRequires: libnfs-devel
BuildRequires: libnsl-devel
BuildRequires: libogg-devel
BuildRequires: libopenssl-devel
-BuildRequires: libpcre-devel
BuildRequires: libpng-devel
BuildRequires: libpostproc-ffmpeg-devel
BuildRequires: libpulseaudio-devel
@@ -77,7 +69,6 @@ BuildRequires: libsmbclient-devel
BuildRequires: libsndio-devel
BuildRequires: libspeex-devel
BuildRequires: libssh2-devel
-BuildRequires: libsystemd-devel
BuildRequires: libtheora-devel
BuildRequires: libv4l-devel
BuildRequires: libva-devel
@@ -98,9 +89,10 @@ BuildRequires: libgomp-devel
BuildRequires: libIDL-devel
BuildRequires: libslang-devel
BuildRequires: libdav1d-devel
-%if "%{_target_cpu}" == "i586"
-BuildRequires: librte-devel
-%endif
+#%if "%{_target_cpu}" == "i586"
+#BuildRequires: librte-devel
+#%endif
+BuildRequires: autoconf
BuildRequires: bison
BuildRequires: gettext-devel
BuildRequires: transfig >= 3.2.4
@@ -108,6 +100,7 @@ BuildRequires: ImageMagick
Provides: %{pkgname} = %{epoch}:%{version}-%{release}
Requires: %{name}-tools = %{epoch}:%{version}-%{release}
Obsoletes: libxine1 < 2:1.2.12
+Obsoletes: libfame <= 0.9.1-5mamba
%description
xine is a free (GPL-licensed) high-performance, portable and reusable multimedia playback engine.
@@ -120,6 +113,7 @@ Requires: %{name} = %{epoch}:%{version}-%{release}
Requires: %{name}-tools = %{epoch}:%{version}-%{release}
Provides: %{pkgname}-devel = %{epoch}:%{version}-%{release}
Obsoletes: libxine1-devel < 2:1.2.12
+Obsoletes: libfame-devel <= 0.9.1-5mamba
%description devel
xine is a free (GPL-licensed) high-performance, portable and reusable multimedia playback engine.
@@ -140,26 +134,41 @@ This is the tools package for the xine-lib library.
%prep
%setup -q -n %{pkgname}.%{version}
-sed -i "s,| arm-\* |,| aarch64-\* | arm-\* |," config.sub
+#-D -T
+#:<< _EOF
+%patch 0 -p1 -b .ffmpeg6-compatibility
+%patch 1 -p1 -b .ffmpeg6-compatibility_2
+%patch 2 -p1 -b .ffmpeg7-compatibility
+%patch 3 -p1 -b .configure-c99
+
+cp /usr/share/autoconf/build-aux/config.* .
+
+#sed -i "s,| arm-\* |,| aarch64-\* | arm-\* |," config.sub
%build
-export CFLAGS="$RPM_OPT_FLAGS -fomit-frame-pointer -Xlinker -zmuldefs"
+#:<< _EOF
+
+export CFLAGS="%{optflags} -fomit-frame-pointer -Xlinker -zmuldefs"
+
%configure \
--enable-ipv6 \
--enable-fb \
--enable-directfb \
--disable-altivec \
- --disable-vis \
+ --disable-faad \
+ --disable-gnomevfs \
--disable-mlib \
+ --disable-vis \
--with-w32-path=%{_libdir}/win32/ \
--with-external-ffmpeg \
--with-external-dvdnav \
- --with-wavpack \
- --enable-vdpau \
--with-libflac \
+ --with-wavpack \
+ --enable-antialiasing \
--enable-modplug \
+ --enable-vdpau \
+ --enable-xvmc \
--without-esound
-# --enable-dha-kmod
find ./ -name Makefile -exec \
sed -i "s/\(.*-mcpu=\)[^ ]*\(.*\)/\1%{_target_cpu}\2/g" {} \;
@@ -167,10 +176,7 @@ find ./ -name Makefile -exec \
# fix to set correct ffmpeg include locations
sed -i "s|\(#define HAVE_FFMPEG_AVUTIL_H 1\)|//\1|" include/configure.h
-%make \
-%ifarch arm
- MMAL_LIBS="-lbcm_host -lmmal -lmmal_core -lmmal_util -lvchostif"
-%endif
+%make
%install
[ %{buildroot} != / ] && rm -rf "%{buildroot}"
@@ -225,6 +231,10 @@ mv %{buildroot}%{_datadir}/doc/xine-lib \
%{_datadir}/xine-lib/*
%changelog
+* Sun May 26 2024 Silvan Calarco 1.2.13-3mamba
+- rebuilt without libfame and obsolete it
+- added ffpmeg 6 and 7 patches from Fedora
+
* Mon Apr 15 2024 Silvan Calarco 1.2.13-2mamba
- rebuilt