Compare commits

..

No commits in common. "rawhide" and "f37" have entirely different histories.
rawhide ... f37

4 changed files with 8 additions and 963 deletions

View File

@ -1,475 +0,0 @@
# HG changeset patch
# User Torsten Jager <t.jager@gmx.de>
# 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;

View File

@ -1,318 +0,0 @@
# HG changeset patch
# User Torsten Jager <t.jager@gmx.de>
# 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

View File

@ -1,116 +0,0 @@
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:
<https://sourceforge.net/p/xine/xine-lib-1.2/merge-requests/2/>
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])

View File

@ -13,6 +13,11 @@
%global _without_gcrypt 1
%endif
%if 0%{?el9}
# RHBZ 2031270
%global _without_nfs 1
%endif
%if 0%{?fedora} || 0%{?rhel} >= 9
# Not permitted in Fedora, ffmpeg covers this anyway
%global _without_faad2 1
@ -26,13 +31,13 @@
%endif
#global snapshot 1
%global date 20240508
%global revision 15289
#global date 20220307
#global revision 15076
Summary: A multimedia engine
Name: xine-lib
Version: 1.2.13
Release: 17%{?snapshot:.%{date}hg%{revision}}%{?dist}
Release: 3%{?snapshot:.%{date}hg%{revision}}%{?dist}
License: GPL-2.0-or-later
URL: https://www.xine-project.org/
%if ! 0%{?snapshot}
@ -46,12 +51,6 @@ Source1: make_xinelib_snapshot.sh
# ffmpeg6 compatibility
# See: https://sourceforge.net/p/xine/xine-lib-1.2/ci/771f4ae27e582123ff3500444718fc8f96186d74/
Patch0: xine-lib-1.2.13-ffmpeg6-compatibility.patch
#
Patch1: xine-lib-configure-c99.patch
# See: https://sourceforge.net/p/xine/xine-lib-1.2/ci/1e7b184008860c8be2289c3cefd9dee57f06193a/
Patch2: xine-lib-1.2.13-ffmpeg6-compatibility_2.patch
# See: https://sourceforge.net/p/xine/xine-lib-1.2/ci/73b833e7fe356cd2d9490dda4ebc9bfe16fce958/
Patch3: xine-lib-1.2.13-ffmpeg7-compatibility.patch
Provides: xine-lib(plugin-abi) = %{plugin_abi}
Provides: xine-lib(plugin-abi)%{?_isa} = %{plugin_abi}
@ -73,8 +72,6 @@ BuildRequires: fontconfig-devel
BuildRequires: gcc
BuildRequires: gettext-devel
BuildRequires: gnutls-devel
# System lib cannot currently be used
#BuildRequires: gsm-devel
BuildRequires: gtk2-devel
%{!?_without_imagemagick:BuildRequires: ImageMagick-devel}
%if 0%{?fedora} || 0%{?rhel} >= 9
@ -110,7 +107,6 @@ BuildRequires: libvorbis-devel
BuildRequires: libvpx-devel
BuildRequires: libX11-devel
BuildRequires: libxcb-devel
BuildRequires: libxdg-basedir-devel
BuildRequires: libXext-devel
BuildRequires: libXinerama-devel
BuildRequires: libXt-devel
@ -353,48 +349,6 @@ mkdir -p %{buildroot}%{codecdir}
%changelog
* Mon Sep 23 2024 Fabio Valentini <decathorpe@gmail.com> - 1.2.13-17
- Rebuild for ffmpeg 7
* Sat Jul 20 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1.2.13-16
- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild
* Tue Jul 16 2024 Nicolas Chauvet <kwizart@gmail.com> - 1.2.13-15
- Rebuilt for libplacebo/vmaf
* Mon May 20 2024 Xavier Bachelot <xavier@bachelot.org>- 1.2.13-14
- Add patches for ffmpeg compatibility
* Wed Mar 13 2024 Sérgio Basto <sergio@serjux.com> - 1.2.13-13
- Rebuild for jpegxl (libjxl) 0.10.2
* Wed Feb 14 2024 Sérgio Basto <sergio@serjux.com> - 1.2.13-12
- Rebuild for jpegxl (libjxl) 0.9.2 with soname bump
* Thu Feb 08 2024 Pete Walter <pwalter@fedoraproject.org> - 1.2.13-11
- Rebuild for libvpx 1.14.x
* Sat Jan 27 2024 Fedora Release Engineering <releng@fedoraproject.org> - 1.2.13-10
- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild
* Fri Jan 12 2024 Fabio Valentini <decathorpe@gmail.com> - 1.2.13-9
- Rebuild for dav1d 1.3.0
* Tue Sep 26 2023 Xavier Bachelot <xavier@bachelot.org> - 1.2.13-8
- Enable nfs support for EL9
* Sat Jul 22 2023 Fedora Release Engineering <releng@fedoraproject.org> - 1.2.13-7
- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild
* Sun Jun 18 2023 Sérgio Basto <sergio@serjux.com> - 1.2.13-6
- Mass rebuild for jpegxl-0.8.1
* Thu Jun 01 2023 Xavier Bachelot <xavier@bachelot.org> - 1.2.13-5
- Rebuild for new libnfs
* Sat Apr 15 2023 Florian Weimer <fweimer@redhat.com> - 1.2.13-4
- Port configure script to C99
* Sat Mar 18 2023 Xavier Bachelot <xavier@bachelot.org> - 1.2.13-3
- Enable external libdvdnav for EL9
- Restore specfile compatibility with RPM Fusion for EL7/8