1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
# HG changeset patch
# User Torsten Jager <t.jager@gmx.de>
# 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
@@ -60,6 +60,10 @@
#include "ffmpeg_compat.h"
+#if XFF_FRAME_RATE == 2
+# include <avcodec/codec_desc.h>
+#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
@@ -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 */
|